<AWT Dev> Fwd: Re: VM hangs in VS2008 build

Alexey Utkin Alexey.Utkin at Sun.COM
Fri Jul 16 08:09:15 PDT 2010


It seems that problem was localized in staff class JavaStringBuffer.
The class has inline implementation in 
jdk\src\windows\native\sun\windows\awt.h

The right code is:

class JavaStringBuffer
{
protected:
     LPWSTR m_pStr;
     jsize  m_dwSize;
     LPWSTR getNonEmptyString() {
         return (NULL==m_pStr)
                 ? L""
                 : m_pStr;
     }

public:
     JavaStringBuffer(jsize cbTCharCount) {
         m_dwSize = cbTCharCount;
         m_pStr = (LPWSTR)safe_Malloc( (m_dwSize+1)*sizeof(WCHAR) );
     }

     JavaStringBuffer(JNIEnv *env, jstring text) {
         if (NULL == text) {
             m_pStr = NULL;
             m_dwSize = 0;
         } else {
             m_dwSize = env->GetStringLength(text);
             m_pStr = (LPWSTR)safe_Malloc( (m_dwSize+1)*sizeof(WCHAR) );
             env->GetStringRegion(text, 0, m_dwSize, 
reinterpret_cast<jchar *>(m_pStr));
             m_pStr[m_dwSize] = 0;
         }
     }

     ~JavaStringBuffer() {
         free(m_pStr);
     }

     void Resize(jsize cbTCharCount) {
         m_dwSize = cbTCharCount;
         m_pStr = (LPWSTR)safe_Realloc(m_pStr, (m_dwSize+1)*sizeof(WCHAR) );
     }
     //we are in UNICODE now, so LPWSTR:=:LPTSTR
     operator LPWSTR() { return getNonEmptyString(); }
     operator LPARAM() { return (LPARAM)getNonEmptyString(); }
     void *GetData() { return (void *)getNonEmptyString(); }
     jsize  GetSize() { return m_dwSize; }
};

That solves the problem.
Regards,
-uta

On 7/15/2010 17:54, Artem Ananiev wrote:
>
> -------- Original Message --------
> Subject: Re: <AWT Dev> VM hangs in VS2008 build
> Date: Tue, 13 Jul 2010 09:15:12 -0700
> From: Phil Race <philip.race at oracle.com>
> To: Artem Ananiev <Artem.Ananiev at Sun.COM>
>
> FYI your test crashes with my VS2010 build on Windows 7, apparently
> also when trying to dispose. Windows whinges about corrupted (C) heap.
> The break point opened by Visual Studio is inside msvcr100.dll at
>
> static unsigned long WINAPI _threadstartex () ->
>   ..
>      _callthreadstartex(); // here.
>
> -phil.
>
> On 7/13/2010 4:56 AM, Artem Ananiev wrote:
>> Hi, AWT & HotSpot teams,
>>
>> I've just experienced a problem with a simple test - see the attached
>> file. The test shows a file dialog and then hangs when the dialog is
>> being disposed. I tried to get a stack trace... and failed, both with
>> jstack and ctrl+break from the console.
>>
>> When I attached to the process with Visual Studio, I noticed several
>> suspicious threads:
>>
>> 1. One of the threads with AWT code waits for safe_Malloc() to return,
>> which in turn waits for JVM code in Monitor::set_owner_implementation():
>>
>>  ntdll.dll!_ZwWaitForSingleObject at 12()
>>  ntdll.dll!_ZwWaitForSingleObject at 12()
>>  jvm.dll!Monitor::set_owner_implementation(Thread *
>> new_owner=0x00000000)  Line 1307
>>  ntdll.dll!_RtlEnterCriticalSection at 4()
>>  ntdll.dll!@RtlpAllocateHeap at 24()
>>  ntdll.dll!_RtlAllocateHeap at 12()
>>  msvcr90.dll!75293db8()
>>  [Frames below may be incorrect and/or missing, no symbols loaded for
>> msvcr90.dll]
>>  awt.dll!safe_Malloc(unsigned int size=6)  Line 85
>>  awt.dll!CreateLocaleObject(JNIEnv_ * env=0x04601d34, const char *
>> name=0x002a1e58)  Line 539
>>  awt.dll!Java_sun_awt_windows_WInputMethod_getNativeLocale(JNIEnv_ *
>> env=0x04601d34, _jclass * cls=0x065bf728)  Line 299
>>
>>
>> 2. Another thread is in os::free():
>>
>>  ntdll.dll!_ZwWaitForSingleObject at 12()
>>  ntdll.dll!_ZwWaitForSingleObject at 12()
>>  KernelBase.dll!_GetProcAddress at 8()
>>  ntdll.dll!_RtlEnterCriticalSection at 4()
>>  ntdll.dll!@RtlpFreeHeap at 16()
>>  ntdll.dll!_RtlFreeHeap at 12()
>>  kernel32.dll!_HeapFree at 12()
>>  msvcr90.dll!75293c1b()
>>  [Frames below may be incorrect and/or missing, no symbols loaded for
>> msvcr90.dll]
>>  jvm.dll!os::free(void * memblock=0x01f64d50)  Line 602
>>  jvm.dll!ChunkPool::free_all_but(unsigned int n=5)  Line 152
>>  jvm.dll!ChunkPoolCleaner::task()  Line 195
>>  jvm.dll!PeriodicTask::real_time_tick(unsigned int delay_time=50)
>> Line 60
>>  jvm.dll!WatcherThread::run()  Line 1086
>>  jvm.dll!java_start(Thread * thread=0x01f5c800)  Line 377
>>
>>
>> 3. One more thread waiting for a memory-related operation - I suspect
>> it's the thread that should provide the stack trace:
>>
>>  ntdll.dll!_ZwWaitForSingleObject at 12()
>>  ntdll.dll!_ZwWaitForSingleObject at 12()
>>  jvm.dll!InterfaceSupport::serialize_memory(JavaThread *
>> thread=0x00000148)  Line 37
>>  kernel32.dll!_WaitForSingleObjectExImplementation at 12()
>>  kernel32.dll!_WaitForSingleObject at 8()
>>  jvm.dll!Win32AttachListener::dequeue()  Line 233
>>  jvm.dll!AttachListener::dequeue()  Line 353
>>  jvm.dll!attach_listener_thread_entry(JavaThread * thread=0x01f4d800,
>> Thread * __the_thread__=0x01f4d800)  Line 376
>>  jvm.dll!JavaThread::thread_main_inner()  Line 1402
>>  jvm.dll!java_start(Thread * thread=0x01f4d800)  Line 377
>>
>>
>> Any ideas about what's going? The hang only occurs if I build JDK and
>> HotSpot using VS2008 - exactly the same JDK7-b99 promoted build (which
>> is built with VS2003) works fine. If I change the file dialog with a
>> regular AWT modal dialog, the problem goes away as well.
>>
>> Thanks,
>>
>> Artem
>
>




More information about the awt-dev mailing list