Forgot to commit this to TOT way back when; will be useful when actually porting...
authormjs <mjs@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 6 Oct 2005 04:36:04 +0000 (04:36 +0000)
committermjs <mjs@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 6 Oct 2005 04:36:04 +0000 (04:36 +0000)
        Reviewed by Geoff.

- fixed <rdar://problem/4214783> REGRESSION: kjs_fast_malloc crash due to lack of locking on multiple threads (seen selecting volumes in the installer)

Make sure to lock using the InterpreterLock class in all places that need it
(including anything that uses the collector, the parser, the protect count hash table,
and anything that allocates via fast_malloc).

        * JSUtils.cpp:
        (CFStringToUString):
        (JSObjectKJSValue):
        (KJSValueToCFTypeInternal):
        * JSUtils.h:
        * JSValueWrapper.cpp:
        (JSValueWrapper::JSObjectCopyPropertyNames):
        (JSValueWrapper::JSObjectCopyProperty):
        (JSValueWrapper::JSObjectSetProperty):
        (JSValueWrapper::JSObjectCallFunction):
        (JSValueWrapper::JSObjectCopyCFValue):
        * JavaScriptGlue.cpp:
        (JSCollect):

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

JavaScriptGlue/ChangeLog
JavaScriptGlue/JSUtils.cpp
JavaScriptGlue/JSUtils.h
JavaScriptGlue/JSValueWrapper.cpp
JavaScriptGlue/JavaScriptGlue.cpp

index c2bb18cf1f397cf29929a0060e7be92249471356..664017f7600b62f49a943295f99e6443fbe3f133 100644 (file)
@@ -1,3 +1,27 @@
+2005-09-14  Maciej Stachowiak  <mjs@apple.com>
+
+        Reviewed by Geoff.
+
+       - fixed <rdar://problem/4214783> REGRESSION: kjs_fast_malloc crash due to lack of locking on multiple threads (seen selecting volumes in the installer)
+
+       Make sure to lock using the InterpreterLock class in all places that need it
+       (including anything that uses the collector, the parser, the protect count hash table,
+       and anything that allocates via fast_malloc).
+
+        * JSUtils.cpp:
+        (CFStringToUString):
+        (JSObjectKJSValue):
+        (KJSValueToCFTypeInternal):
+        * JSUtils.h:
+        * JSValueWrapper.cpp:
+        (JSValueWrapper::JSObjectCopyPropertyNames):
+        (JSValueWrapper::JSObjectCopyProperty):
+        (JSValueWrapper::JSObjectSetProperty):
+        (JSValueWrapper::JSObjectCallFunction):
+        (JSValueWrapper::JSObjectCopyCFValue):
+        * JavaScriptGlue.cpp:
+        (JSCollect):
+
 2005-09-27  Adele Peterson  <adele@apple.com>
 
         Reviewed by Maciej.
index 59277bda851acddce85267bb0bf03b75955b8e62..592b36e75f61f83b583404466100fc9cd8e5e369 100644 (file)
@@ -25,9 +25,10 @@ static CFTypeRef KJSValueToCFTypeInternal(const Value& inValue, ExecState *exec,
 
 UString CFStringToUString(CFStringRef inCFString)
 {
-       UString result;
-    if (inCFString)
-    {
+    InterpreterLock lock;
+
+    UString result;
+    if (inCFString) {
         CFIndex len = CFStringGetLength(inCFString);
         UniChar* buffer = (UniChar*)malloc(sizeof(UniChar) * len);
         if (buffer)
@@ -37,7 +38,7 @@ UString CFStringToUString(CFStringRef inCFString)
             free(buffer);
         }
     }
-       return result;
+    return result;
 }
 
 
@@ -111,6 +112,8 @@ JSUserObject*               KJSValueToJSObject(const Value& inValue, ExecState *exec)
 //--------------------------------------------------------------------------
 Value JSObjectKJSValue(JSUserObject* ptr)
 {
+    InterpreterLock lock;
+
     Value result = Undefined();
     if (ptr)
     {
@@ -202,6 +205,8 @@ CFTypeRef KJSValueToCFTypeInternal(const Value& inValue, ExecState *exec, Object
                
        CFTypeRef result = NULL;
        
+        InterpreterLock lock;
+
        switch (inValue.type())
        {
                case BooleanType:
index 9f5fa6e3050592e23ee0e64a69e262b44d081897..64477431ef6e6f8c86ff2eab1f3e1b85ad09b465 100644 (file)
@@ -22,6 +22,7 @@
 #include <JavaScriptCore/object.h>
 #include <JavaScriptCore/types.h>
 #include <JavaScriptCore/interpreter.h>
+#include <JavaScriptCore/protect.h>
 #include <JavaScriptCore/collector.h>
 #include <JavaScriptCore/ustring.h>
 #endif
index 1cecf8ab96e0052402911953e38d1e1782d6fcf5..eb92974ef682758ffd98a8b8eac672c98c008755 100644 (file)
@@ -42,6 +42,8 @@ void JSValueWrapper::JSObjectDispose(void* data)
 
 CFArrayRef JSValueWrapper::JSObjectCopyPropertyNames(void* data)
 {
+    InterpreterLock lock;
+
        CFMutableArrayRef result = NULL;
        JSValueWrapper* ptr = (JSValueWrapper*)data;
        if (ptr)
@@ -85,6 +87,8 @@ CFArrayRef JSValueWrapper::JSObjectCopyPropertyNames(void* data)
 
 JSObjectRef JSValueWrapper::JSObjectCopyProperty(void* data, CFStringRef propertyName)
 {
+    InterpreterLock lock;
+
        JSObjectRef result = NULL;
        JSValueWrapper* ptr = (JSValueWrapper*)data;
        if (ptr)
@@ -111,6 +115,8 @@ JSObjectRef JSValueWrapper::JSObjectCopyProperty(void* data, CFStringRef propert
 
 void JSValueWrapper::JSObjectSetProperty(void* data, CFStringRef propertyName, JSObjectRef jsValue)
 {
+    InterpreterLock lock;
+
        JSValueWrapper* ptr = (JSValueWrapper*)data;
        if (ptr)
        {
@@ -128,6 +134,8 @@ void JSValueWrapper::JSObjectSetProperty(void* data, CFStringRef propertyName, J
 
 JSObjectRef JSValueWrapper::JSObjectCallFunction(void* data, JSObjectRef thisObj, CFArrayRef args)
 {
+    InterpreterLock lock;
+
        JSObjectRef result = NULL;
        JSValueWrapper* ptr = (JSValueWrapper*)data;
        if (ptr)
@@ -167,6 +175,8 @@ JSObjectRef JSValueWrapper::JSObjectCallFunction(void* data, JSObjectRef thisObj
 
 CFTypeRef JSValueWrapper::JSObjectCopyCFValue(void* data)
 {
+    InterpreterLock lock;
+
        CFTypeRef result = NULL;
        JSValueWrapper* ptr = (JSValueWrapper*)data;
        if (ptr)
index 89007040b0d6938391831bbf16cc720267f4b191..731c6d63f168ce336d8f157d7cbfc695ae79e21a 100644 (file)
@@ -317,9 +317,8 @@ bool JSRunCheckSyntax(JSRunRef ref)
 void JSCollect(void)
 {
 #if JAG_PINK_OR_LATER
-       Interpreter::lock();
+    InterpreterLock lock;
        Collector::collect();
-       Interpreter::unlock(); 
 #endif
 }