[Win] jsc.exe sometimes never exits.
authorpvollan@apple.com <pvollan@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 3 Jan 2017 10:24:38 +0000 (10:24 +0000)
committerpvollan@apple.com <pvollan@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 3 Jan 2017 10:24:38 +0000 (10:24 +0000)
https://bugs.webkit.org/show_bug.cgi?id=158073

Reviewed by Darin Adler.

On Windows the thread specific destructor is also called when the main thread is exiting.
This may lead to the main thread waiting forever for the machine thread lock when exiting,
if the sampling profiler thread was terminated by the system while holding the machine
thread lock.

* heap/MachineStackMarker.cpp:
(JSC::MachineThreads::removeThread):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@210237 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/heap/MachineStackMarker.cpp

index 6eb8698..3146ccb 100644 (file)
@@ -1,3 +1,18 @@
+2017-01-03  Per Arne Vollan  <pvollan@apple.com>
+
+        [Win] jsc.exe sometimes never exits.
+        https://bugs.webkit.org/show_bug.cgi?id=158073
+
+        Reviewed by Darin Adler.
+
+        On Windows the thread specific destructor is also called when the main thread is exiting.
+        This may lead to the main thread waiting forever for the machine thread lock when exiting,
+        if the sampling profiler thread was terminated by the system while holding the machine
+        thread lock.
+
+        * heap/MachineStackMarker.cpp:
+        (JSC::MachineThreads::removeThread):
+
 2017-01-02  Julien Brianceau  <jbriance@cisco.com>
 
         Remove sh4 specific code from JavaScriptCore
index 15c85ad..df77939 100644 (file)
@@ -32,6 +32,7 @@
 #include "VM.h"
 #include <setjmp.h>
 #include <stdlib.h>
+#include <wtf/MainThread.h>
 #include <wtf/StdLibExtras.h>
 
 #if OS(DARWIN)
@@ -276,6 +277,17 @@ void THREAD_SPECIFIC_CALL MachineThreads::removeThread(void* p)
         // to be instantiated at the same address. Hence, this thread may or
         // may not be found in this MachineThreads registry. We only need to
         // do a removal if this thread is found in it.
+
+#if PLATFORM(WIN)
+        // On Windows the thread specific destructor is also called when the
+        // main thread is exiting. This may lead to the main thread waiting
+        // forever for the machine thread lock when exiting, if the sampling
+        // profiler thread was terminated by the system while holding the
+        // machine thread lock.
+        if (WTF::isMainThread())
+            return;
+#endif
+
         machineThreads->removeThreadIfFound(getCurrentPlatformThread());
     }
 }