Photo Booth hangs under JSC::MachineThreads::tryCopyOtherThreadStacks
authorggaren@apple.com <ggaren@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 26 May 2015 22:59:38 +0000 (22:59 +0000)
committerggaren@apple.com <ggaren@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 26 May 2015 22:59:38 +0000 (22:59 +0000)
https://bugs.webkit.org/show_bug.cgi?id=145395

Reviewed by Mark Hahnenberg.

No test case because we already have --threaded mode, which runs lots of
parallel GC, but it (and the original in-app test case) can't reproduce
this bug.

* heap/MachineStackMarker.cpp:
(JSC::MachineThreads::tryCopyOtherThreadStacks): Use a lock to prevent
two threads from mutually suspending each other.

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

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

index 2ddd757..9947839 100644 (file)
@@ -1,3 +1,18 @@
+2015-05-26  Geoffrey Garen  <ggaren@apple.com>
+
+        Photo Booth hangs under JSC::MachineThreads::tryCopyOtherThreadStacks
+        https://bugs.webkit.org/show_bug.cgi?id=145395
+
+        Reviewed by Mark Hahnenberg.
+
+        No test case because we already have --threaded mode, which runs lots of
+        parallel GC, but it (and the original in-app test case) can't reproduce
+        this bug.
+
+        * heap/MachineStackMarker.cpp:
+        (JSC::MachineThreads::tryCopyOtherThreadStacks): Use a lock to prevent
+        two threads from mutually suspending each other.
+
 2015-05-26  Yusuke Suzuki  <utatane.tea@gmail.com>
 
         Add Array.prototype.copyWithin to JSC features.json
 2015-05-26  Yusuke Suzuki  <utatane.tea@gmail.com>
 
         Add Array.prototype.copyWithin to JSC features.json
index c789d90..82e0b2d 100644 (file)
@@ -563,6 +563,11 @@ void MachineThreads::tryCopyOtherThreadStack(Thread* thread, void* buffer, size_
 
 bool MachineThreads::tryCopyOtherThreadStacks(MutexLocker&, void* buffer, size_t capacity, size_t* size)
 {
 
 bool MachineThreads::tryCopyOtherThreadStacks(MutexLocker&, void* buffer, size_t capacity, size_t* size)
 {
+    // Prevent two VMs from suspending each other's threads at the same time,
+    // which can cause deadlock: <rdar://problem/20300842>.
+    static StaticSpinLock mutex;
+    std::lock_guard<StaticSpinLock> lock(mutex);
+
     *size = 0;
 
     PlatformThread currentPlatformThread = getCurrentPlatformThread();
     *size = 0;
 
     PlatformThread currentPlatformThread = getCurrentPlatformThread();