RFR (S): 8211909: JDWP Transport Listener: dt_socket thread crash
David Holmes
david.holmes at oracle.com
Mon Oct 15 19:46:40 UTC 2018
Thanks for the review Dan!
David
On 16/10/2018 1:05 AM, Daniel D. Daugherty wrote:
> On 10/15/18 1:12 AM, David Holmes wrote:
>> Bug: https://bugs.openjdk.java.net/browse/JDK-8211909
>> webrev: http://cr.openjdk.java.net/~dholmes/8211909/webrev/
>
> src/hotspot/share/prims/jvmtiEnv.cpp
> No comments.
>
> Thumbs up on the code changes.
>
>
>> The crash occurs when trying to access a thread that was returned as
>> part of JVM TI GetThreadGroupChildren. The problem is that the JVM TI
>> code tries to use the Threads_lock to ensure atomic access to the
>> ThreadGroup's threads and child groups:
>>
>> { // Cannot allow thread or group counts to change.
>> MutexLocker mu(Threads_lock);
>>
>> but the Threads_lock does not control concurrency in the Java code
>> that can cause threads to be added and removed, so we do not get a
>> stable snapshot of the thread array and its length, and contents. To
>> get a stable snapshot we have to use the same synchronization
>> mechanism as used by the Java code: lock the monitor of the
>> ThreadGroup instance.
>
> Agreed that the wrong locking mechanism was used.
>
> Side note: The '// Cannot allow thread or group counts to change.'
> comment was added sometime after we switched from TeamWare to
> Mercurial.
>
> Looks like all three uses of Threads_lock that you removed
> date back to the original JVM/TI delta:
>
> $ sgv src/share/vm/prims/jvmtiEnv.cpp | grep '{ MutexLocker
> mu(Threads_lock);'
> 1.168
> 1.1 { MutexLocker mu(Threads_lock);
> 1.1 { MutexLocker mu(Threads_lock);
> 1.1 { MutexLocker mu(Threads_lock);
> 3358 lines
> No id keywords (cm7)
>
> $ sp -r1.1 src/share/vm/prims/jvmtiEnv.cpp
> src/share/vm/prims/SCCS/s.jvmtiEnv.cpp:
>
> D 1.1 03/01/28 20:52:06 rfield 1 0 03130/00000/00000
> MRs:
> COMMENTS:
> date and time created 03/01/28 20:52:06 by rfield
>
>
>> Two other pointless acquisitions of the Threads_lock, in GetThreadInfo
>> and GetThreadGroupInfo, were also removed. These functions could
>> report an inconsistent snapshot of the Thread or ThreadGroup state, if
>> the mutable state is mutated concurrently. Again we could acquire the
>> object's monitor to prevent this but it is unclear that there is any
>> real benefit in doing so - after all the thread/group information
>> could change immediately after it has been read anyway. So here I just
>> delete the Threads_lock usage.
>
> Also agreed. I ran into all three of these in the Thread-SMR project
> and I couldn't convince myself to remove the use of Threads_lock for
> these two. I missed that the wrong lock was used for JVM/TI
> GetThreadGroupChildren().
>
> Very nice catch!
>
> Dan
>
>
>>
>> Testing: mach5 tier 1-3
>> JVM TI tests (serviceability/jvmti vmTestbase/nsk/jvmti/)
>>
>> A regression test may be possible if we call GetThreadGroupChildren in
>> a loop, whilst threads add and remove themselves from the group
>> concurrently. But it is awkward to write.
>>
>> Thanks,
>> David
>>
>> Thanks,
>> David
>
More information about the serviceability-dev
mailing list