RFR: JDK-8033696: "assert(thread != NULL) failed: just checking" due to Thread::current() and JNI pthread interaction

Dmitry Samersoff dmitry.samersoff at oracle.com
Wed Apr 2 15:36:22 UTC 2014


Andreas,

Looks good for me!

-Dmitry

On 2014-04-02 19:26, Andreas Eriksson wrote:
> Thanks David.
> 
> Could I get a second review as well?
> 
> Thanks,
> Andreas
> 
> On 2014-03-26 10:38, David Holmes wrote:
>> Still seems okay to me.
>>
>> Thanks,
>> David
>>
>> On 25/03/2014 7:55 PM, Andreas Eriksson wrote:
>>> Hi,
>>>
>>> Could I get some eyes on this new webrev?
>>>
>>> Thanks,
>>> Andreas
>>>
>>> On 2014-03-04 01:12, Andreas Eriksson wrote:
>>>> That output was because the VMThread didn't reset it's TLS before
>>>> exiting (presumably since the VM is shutting down anyway).
>>>> This meant that the thread pointer destructor was run until the
>>>> pthread implementation gave up.
>>>> I added code that sets the thread pointer to NULL before exiting the
>>>> VMThread, ensuring the thread pointer destructor is never called for
>>>> the exiting VMThread.
>>>>
>>>> A new updated webrev can be found here:
>>>> http://cr.openjdk.java.net/~aeriksso/8033696/webrev.01/
>>>>
>>>> I also removed the bug reference from the comments, since I got the
>>>> feeling that it's usually discouraged.
>>>>
>>>> Thanks,
>>>> Andreas
>>>>
>>>> On 2014-02-27 13:34, Andreas Eriksson wrote:
>>>>> Oh, sorry, I misread your mail.
>>>>>
>>>>> I will look into the pthread output from java -version.
>>>>>
>>>>> Thread 80103f400 has exited with leftover thread-specific data after 4
>>>>> destructor iterations
>>>>>
>>>>> Thanks,
>>>>> Andreas
>>>>>
>>>>> On 2014-02-27 12:39, Dmitry Samersoff wrote:
>>>>>> Andreas,
>>>>>>
>>>>>> I's not growing - always only two threads.
>>>>>>
>>>>>> -Dmitry
>>>>>>
>>>>>> On 2014-02-27 14:23, Andreas Eriksson wrote:
>>>>>>> Thanks Dmitry.
>>>>>>>
>>>>>>> There are no crashes, only an assert that is hit if running with a
>>>>>>> debug
>>>>>>> build.
>>>>>>> Otherwise the active threads keep growing, like you are seeing.
>>>>>>>
>>>>>>> It is worrying that they keep growing with the patch as well.
>>>>>>> I will have to look at it and see what can be done.
>>>>>>>
>>>>>>> Regards,
>>>>>>> Andreas
>>>>>>>
>>>>>>> On 2014-02-26 21:14, Dmitry Samersoff wrote:
>>>>>>>> Andreas,
>>>>>>>>
>>>>>>>> With JDK7 I didn't observe any crash with or without your patch.
>>>>>>>> Without the patch the number of active threads constantly grows,
>>>>>>>> with patch it remains the same.
>>>>>>>>
>>>>>>>>
>>>>>>>> uname -a
>>>>>>>> FreeBSD samersoff.net 9.2-RELEASE FreeBSD 9.2-RELEASE #1: Thu
>>>>>>>> Jan  2
>>>>>>>> 02:15:13 MSK 2014 dms at minext:/sys/amd64/compile/MIRCAT amd64
>>>>>>>>
>>>>>>>>
>>>>>>>> With patch:
>>>>>>>>
>>>>>>>> #java -version
>>>>>>>>
>>>>>>>> openjdk version "1.7.0_45"
>>>>>>>> OpenJDK Runtime Environment (build 1.7.0_45-b18)
>>>>>>>> OpenJDK 64-Bit Server VM (build 24.45-b08, mixed mode)
>>>>>>>> Thread 80103f400 has exited with leftover thread-specific data
>>>>>>>> after 4
>>>>>>>> destructor iterations
>>>>>>>>
>>>>>>>> #$JAVA_HOME/bin/java -Djava.library.path=$NATIVE
>>>>>>>> com.test.callback.App
>>>>>>>>
>>>>>>>> Java callback: native thread: 34376799232, java thread:
>>>>>>>> Thread-391, 2
>>>>>>>> active threads
>>>>>>>> Successfully detached native thread 0x801045400
>>>>>>>> Deleting callback
>>>>>>>>
>>>>>>>>
>>>>>>>> Without patch:
>>>>>>>>
>>>>>>>> #/opt/openjdk7/bin/java -version
>>>>>>>>
>>>>>>>> openjdk version "1.7.0_25"
>>>>>>>> OpenJDK Runtime Environment (build 1.7.0_25-b15)
>>>>>>>> OpenJDK 64-Bit Server VM (build 23.21-b01, mixed mode)
>>>>>>>>
>>>>>>>> #/opt/openjdk7/bin/java -Djava.library.path=$NATIVE
>>>>>>>> com.test.callback.App
>>>>>>>>
>>>>>>>> Java callback: native thread: 34376788992, java thread:
>>>>>>>> Thread-402, 404
>>>>>>>> active threads
>>>>>>>> Successfully detached native thread 0x801042c00
>>>>>>>> Deleting callback
>>>>>>>>
>>>>>>>> -Dmitry
>>>>>>>>
>>>>>>>>
>>>>>>>> On 2014-02-10 20:21, Andreas Eriksson wrote:
>>>>>>>>> Hi,
>>>>>>>>>
>>>>>>>>> Could I please get reviews for this change.
>>>>>>>>> JBS: https://bugs.openjdk.java.net/browse/JDK-8033696
>>>>>>>>> Webrev: http://cr.openjdk.java.net/~aeriksso/8033696/webrev.00/
>>>>>>>>> Mail discussion:
>>>>>>>>> http://mail.openjdk.java.net/pipermail/hotspot-runtime-dev/2014-February/010759.html
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Summary:
>>>>>>>>> JNI code is using pthread_key_create with a destructor to
>>>>>>>>> detach the
>>>>>>>>> thread from the JVM when the thread is exiting.
>>>>>>>>> For some flavors of Linux and BSD the JVM is also using the
>>>>>>>>> pthread_key_create, to store the Thread::current() value in a
>>>>>>>>> thread
>>>>>>>>> local storage.
>>>>>>>>> Since the thread local storage containing the thread pointer is
>>>>>>>>> erased
>>>>>>>>> (by pthread) before the JNI destructor runs, we run
>>>>>>>>> detachCurrentThread
>>>>>>>>> on a thread that has NULL as current thread.
>>>>>>>>> This fix uses a destructor for the thread pointer that restores
>>>>>>>>> the
>>>>>>>>> value, so that the JNI destructor can run detachCurrentThread
>>>>>>>>> successfully.
>>>>>>>>> More info in JBS.
>>>>>>>>>
>>>>>>>>> Testing:
>>>>>>>>> Native code regtest attached to JBS tested on Linux, but not on
>>>>>>>>> Mac
>>>>>>>>> since I don't have access to one.
>>>>>>>>> JPRT ran without a problem.
>>>>>>>>>
>>>>>>>>> Regards,
>>>>>>>>> Andreas
>>>>>>
>>>>>
>>>>
>>>
> 


-- 
Dmitry Samersoff
Oracle Java development team, Saint Petersburg, Russia
* I would love to change the world, but they won't give me the sources.


More information about the hotspot-runtime-dev mailing list