JSLock release should only modify the AtomicStringTable if it modified in acquire
authorjoepeck@webkit.org <joepeck@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 24 Jul 2014 23:56:34 +0000 (23:56 +0000)
committerjoepeck@webkit.org <joepeck@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 24 Jul 2014 23:56:34 +0000 (23:56 +0000)
https://bugs.webkit.org/show_bug.cgi?id=135143

Reviewed by Darin Adler.

* runtime/JSLock.cpp:
(JSC::JSLock::JSLock):
Initialize the member variable to nullptr.

(JSC::JSLock::willDestroyVM):
Update style to use nullptr instead of 0.

(JSC::JSLock::willReleaseLock):
We should only reset the thread data's atomic string table if
didAcquireLock changed it. m_entryAtomicStringTable will have
been set by didAcquireLock if it changed, or nullptr if it didn't.
This way we are sure we are balanced, regardless of m_vm changes.

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

Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/runtime/JSLock.cpp

index 8d5dfee..219391d 100644 (file)
@@ -1,3 +1,23 @@
+2014-07-24  Joseph Pecoraro  <pecoraro@apple.com>
+
+        JSLock release should only modify the AtomicStringTable if it modified in acquire
+        https://bugs.webkit.org/show_bug.cgi?id=135143
+
+        Reviewed by Darin Adler.
+
+        * runtime/JSLock.cpp:
+        (JSC::JSLock::JSLock):
+        Initialize the member variable to nullptr.
+
+        (JSC::JSLock::willDestroyVM):
+        Update style to use nullptr instead of 0.
+
+        (JSC::JSLock::willReleaseLock):
+        We should only reset the thread data's atomic string table if
+        didAcquireLock changed it. m_entryAtomicStringTable will have
+        been set by didAcquireLock if it changed, or nullptr if it didn't.
+        This way we are sure we are balanced, regardless of m_vm changes.
+
 2014-07-24  Peyton Randolph  <prandolph@apple.com>
 
         Rename feature flag for long-press gesture on Mac.                                                                   
index 2114f15..af8e272 100644 (file)
@@ -83,6 +83,7 @@ JSLock::JSLock(VM* vm)
     , m_lockDropDepth(0)
     , m_hasExclusiveThread(false)
     , m_vm(vm)
+    , m_entryAtomicStringTable(nullptr)
 {
 }
 
@@ -93,7 +94,7 @@ JSLock::~JSLock()
 void JSLock::willDestroyVM(VM* vm)
 {
     ASSERT_UNUSED(vm, m_vm == vm);
-    m_vm = 0;
+    m_vm = nullptr;
 }
 
 void JSLock::setExclusiveThread(std::thread::id threadId)
@@ -139,7 +140,10 @@ void JSLock::didAcquireLock()
     WTFThreadData& threadData = wtfThreadData();
     m_vm->setLastStackTop(threadData.savedLastStackTop());
 
+    ASSERT(!m_entryAtomicStringTable);
     m_entryAtomicStringTable = threadData.setCurrentAtomicStringTable(m_vm->atomicStringTable());
+    ASSERT(m_entryAtomicStringTable);
+
     m_vm->heap.machineThreads().addCurrentThread();
 }
 
@@ -170,7 +174,10 @@ void JSLock::willReleaseLock()
     if (m_vm)
         m_vm->setStackPointerAtVMEntry(nullptr);
 
-    wtfThreadData().setCurrentAtomicStringTable(m_entryAtomicStringTable);
+    if (m_entryAtomicStringTable) {
+        wtfThreadData().setCurrentAtomicStringTable(m_entryAtomicStringTable);
+        m_entryAtomicStringTable = nullptr;
+    }
 }
 
 void JSLock::lock(ExecState* exec)