After applying your patches I still saw the cleanup messages from pthread.  
After comparing my original patch to yours and doing some testing it looks like 
we missed a couple spots.

The warning went away after I applied the following patches:
http://brian.timestudybuddy.com/webrev/hotspot__clear_thread_current/webrev/hotspot/src/share/vm/gc/shared/concurrentGCThread.cpp.cdiff.html
 
<http://brian.timestudybuddy.com/webrev/hotspot__clear_thread_current/webrev/hotspot/src/share/vm/gc/shared/concurrentGCThread.cpp.cdiff.html>
 
http://brian.timestudybuddy.com/webrev/hotspot__clear_thread_current/webrev/hotspot/src/share/vm/gc/cms/concurrentMarkSweepThread.cpp.cdiff.html
 
<http://brian.timestudybuddy.com/webrev/hotspot__clear_thread_current/webrev/hotspot/src/share/vm/gc/cms/concurrentMarkSweepThread.cpp.cdiff.html>

Brian

> On May 3, 2016, at 4:39 PM, David Holmes <david.hol...@oracle.com> wrote:
> 
> This needs attention from GC and runtime folk please.
> 
> bug: https://bugs.openjdk.java.net/browse/JDK-8154715
> webrev: http://cr.openjdk.java.net/~dholmes/8154715/webrev/
> 
> tl;dr: ensure ThreadLocalStorage::set_thread(NULL) is always called before a 
> thread terminates.
> 
> Background:
> 
> Most system-related threads do not expect to explicitly terminate, except 
> sometimes as part of VM termination. Such threads don't have their 
> destructors called, but should.
> 
> This omission came to light due to the ThreadLocalStorage changes in 
> JDK-8132510. As part of that change we deleted the following from the 
> termination path of the VMThread:
> 
> // Thread destructor usually does this.
> ThreadLocalStorage::set_thread(NULL);
> 
> The clearing of TLS seemed irrelevant to the VMThread as it primarily is used 
> to aid in JNI attach/detach. However Brian Gardner reported:
> 
> http://mail.openjdk.java.net/pipermail/bsd-port-dev/2016-February/002788.html
> 
> a problem on FreeBSD caused by this change and the interaction with the POSIX 
>  pthread TLS destructor use introduced by JDK-8033696. Because the VMThread 
> terminated without clearing TLS, when the TLS-destructor was called it got 
> into a loop which ran four times (as happens on Linux) and then prints a 
> warning to the console (which doesn't happen on Linux).
> 
> This indicates we need to restore the:
> 
> ThreadLocalStorage::set_thread(NULL);
> 
> but on further consideration it seems to me that this is not confined to the 
> VMThread, and the most appropriate fix would be to always invoke the Thread 
> destructor as a thread terminates.
> 
> Solution:
> 
> Further investigation shows that calling the Thread destructor in the thread 
> as it terminates is not possible:
> 
> - VMThread
> 
> This is actually destroyed by the thread that terminates the VM, but that can 
> happen after it terminates and so we still hit the TLS problem. The VMThread 
> may be able to destroy itself today but in the past this was not possible 
> (see existing code comment), and in the future it may also not be possible - 
> the problem is that the Thread destructor can interact with other VM 
> subsystems that are concurrently being torn down by the thread that is 
> terminating the VM. In the past this was the CodeHeap. So rather than 
> introduce something that is fragile we stick with the current scheme but 
> restore the ThreadLocalStorage::set_thread(NULL); - note we can't access 
> "this" at that time because it may already have been de-allocated.
> 
> - WatcherThread
> 
> The WatcherThread is never destroyed today but has the same problem as the 
> VMThread. We can call the destructor from the VM termination thread (and have 
> implemented that), but not from the WatcherThread itself. So again we just 
> have to restore the ThreadLocalStorage::set_thread(NULL); to fix the 
> potential TLS problem.
> 
> - GC Threads
> 
> There are two cases:
> 
> a) GC threads that never terminate
> 
> For these we don't need to do anything: we can't delete the thread as it 
> never terminates and we don't hit the TLS problem because it never 
> terminates. So all we will do here is add some logic to check (in 
> NON_PRODUCT) that we do in fact never terminate.
> 
> b) GC threads that can terminate
> 
> Despite the fact the threads can terminate, references to those threads are 
> stored elsewhere (WorkGangs and other places) and are not cleared as part of 
> the termination process. Those references can be touched after the thread has 
> terminated so we can not call the destructor at all. So again all we can do 
> (without some major thread management reworking) is ensure that 
> ThreadLocalStorage::set_thread(NULL); is called before the thread actually 
> terminates
> 
> Testing: JPRT
>         RBT - runtime nightly tests
> 
> Thanks,
> David
> 



Reply via email to