JavaScriptCore:
authormjs <mjs@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 23 Nov 2005 05:41:23 +0000 (05:41 +0000)
committermjs <mjs@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 23 Nov 2005 05:41:23 +0000 (05:41 +0000)
        Reviewed by Geoff.

<rdar://problem/4139620> Seed: WebKit: hang when sending XMLHttpRequest if automatic proxy config is used

Also factored locking code completely into a separate class, and
added a convenient packaged way to temporarily drop locks.

        * JavaScriptCore.xcodeproj/project.pbxproj:
        * kjs/JSLock.cpp: Added.
        (KJS::initializeInterpreterLock):
        (KJS::InterpreterLock::lock):
        (KJS::InterpreterLock::unlock):
        (KJS::InterpreterLock::lockCount):
        (KJS::InterpreterLock::DropAllLocks::DropAllLocks):
        (KJS::InterpreterLock::DropAllLocks::~DropAllLocks):
        * kjs/JSLock.h: Added.
        (KJS::InterpreterLock::InterpreterLock):
        (KJS::InterpreterLock::~InterpreterLock):
        * kjs/internal.cpp:
        * kjs/internal.h:
        * kjs/interpreter.cpp:
        * kjs/interpreter.h:
        * kjs/protect.h:
        * kjs/testkjs.cpp:
        (TestFunctionImp::callAsFunction):

WebCore:

        Reviewed by Geoff.

<rdar://problem/4139620> Seed: WebKit: hang when sending XMLHttpRequest if automatic proxy config is used

        * khtml/ecma/kjs_events.cpp:
        (KJS::JSLazyEventListener::parseCode):
        * khtml/ecma/xmlhttprequest.cpp:
        (KJS::XMLHttpRequest::send):
        * kwq/WebCoreJavaScript.mm:

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

17 files changed:
JavaScriptCore/ChangeLog
JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj
JavaScriptCore/kjs/JSLock.cpp [new file with mode: 0644]
JavaScriptCore/kjs/JSLock.h [new file with mode: 0644]
JavaScriptCore/kjs/collector.cpp
JavaScriptCore/kjs/config.h
JavaScriptCore/kjs/internal.cpp
JavaScriptCore/kjs/internal.h
JavaScriptCore/kjs/interpreter.cpp
JavaScriptCore/kjs/interpreter.h
JavaScriptCore/kjs/protect.h
JavaScriptCore/kjs/protected_values.cpp
JavaScriptCore/kjs/testkjs.cpp
WebCore/ChangeLog-2005-12-19
WebCore/khtml/ecma/kjs_events.cpp
WebCore/khtml/ecma/xmlhttprequest.cpp
WebCore/kwq/WebCoreJavaScript.mm

index 1a9b312bc8d367054590de351fac73a4998e3f0a..b726fd1ca77494ac81273ffd15d4bafbd948cab8 100644 (file)
@@ -1,3 +1,31 @@
+2005-11-21  Maciej Stachowiak  <mjs@apple.com>
+
+        Reviewed by Geoff.
+
+       <rdar://problem/4139620> Seed: WebKit: hang when sending XMLHttpRequest if automatic proxy config is used
+
+       Also factored locking code completely into a separate class, and
+       added a convenient packaged way to temporarily drop locks.
+
+        * JavaScriptCore.xcodeproj/project.pbxproj:
+        * kjs/JSLock.cpp: Added.
+        (KJS::initializeInterpreterLock):
+        (KJS::InterpreterLock::lock):
+        (KJS::InterpreterLock::unlock):
+        (KJS::InterpreterLock::lockCount):
+        (KJS::InterpreterLock::DropAllLocks::DropAllLocks):
+        (KJS::InterpreterLock::DropAllLocks::~DropAllLocks):
+        * kjs/JSLock.h: Added.
+        (KJS::InterpreterLock::InterpreterLock):
+        (KJS::InterpreterLock::~InterpreterLock):
+        * kjs/internal.cpp:
+        * kjs/internal.h:
+        * kjs/interpreter.cpp:
+        * kjs/interpreter.h:
+        * kjs/protect.h:
+        * kjs/testkjs.cpp:
+        (TestFunctionImp::callAsFunction):
+
 2005-11-21  Eric Seidel  <eseidel@apple.com>
 
         Rubber-stamped by hyatt.
index 465aa397777c86353e278030163cac4fe61f8223..a0bc01f68cc802f917b6acc1ac6f730da5d415a1 100644 (file)
@@ -45,6 +45,8 @@
                65E217BE08E7EECC0023E5F6 /* Assertions.mm in Sources */ = {isa = PBXBuildFile; fileRef = 65E217B808E7EECC0023E5F6 /* Assertions.mm */; };
                65E217BF08E7EECC0023E5F6 /* FastMalloc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 65E217B908E7EECC0023E5F6 /* FastMalloc.cpp */; };
                65E217C008E7EECC0023E5F6 /* FastMalloc.h in Headers */ = {isa = PBXBuildFile; fileRef = 65E217BA08E7EECC0023E5F6 /* FastMalloc.h */; settings = {ATTRIBUTES = (Private, ); }; };
+               65EA4C9B092AF9E20093D800 /* JSLock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 65EA4C99092AF9E20093D800 /* JSLock.cpp */; };
+               65EA4C9C092AF9E20093D800 /* JSLock.h in Headers */ = {isa = PBXBuildFile; fileRef = 65EA4C9A092AF9E20093D800 /* JSLock.h */; settings = {ATTRIBUTES = (Private, ); }; };
                930754C108B0F68000AB3056 /* pcre_compile.c in Sources */ = {isa = PBXBuildFile; fileRef = 930754BF08B0F68000AB3056 /* pcre_compile.c */; };
                930754D008B0F74600AB3056 /* pcre_tables.c in Sources */ = {isa = PBXBuildFile; fileRef = 930754CE08B0F74500AB3056 /* pcre_tables.c */; };
                930754D308B0F76300AB3056 /* pcre_globals.c in Sources */ = {isa = PBXBuildFile; fileRef = 930754D108B0F76200AB3056 /* pcre_globals.c */; };
                65E217B808E7EECC0023E5F6 /* Assertions.mm */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.objcpp; path = Assertions.mm; sourceTree = "<group>"; };
                65E217B908E7EECC0023E5F6 /* FastMalloc.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = FastMalloc.cpp; sourceTree = "<group>"; };
                65E217BA08E7EECC0023E5F6 /* FastMalloc.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = FastMalloc.h; sourceTree = "<group>"; };
+               65EA4C99092AF9E20093D800 /* JSLock.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = JSLock.cpp; sourceTree = "<group>"; };
+               65EA4C9A092AF9E20093D800 /* JSLock.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = JSLock.h; sourceTree = "<group>"; };
                700DA117065984CE00747C0B /* WebScriptObjectPrivate.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = WebScriptObjectPrivate.h; path = bindings/objc/WebScriptObjectPrivate.h; sourceTree = "<group>"; };
                704FD35305697E6D003DBED9 /* bool_object.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = bool_object.h; sourceTree = "<group>"; };
                704FD44505698F17003DBED9 /* runtime.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = runtime.cpp; path = bindings/runtime.cpp; sourceTree = "<group>"; };
                08FB77AEFE84172EC02AAC07 /* Classes */ = {
                        isa = PBXGroup;
                        children = (
+                               65EA4C99092AF9E20093D800 /* JSLock.cpp */,
+                               65EA4C9A092AF9E20093D800 /* JSLock.h */,
                                65621E6B089E859700760F35 /* property_slot.cpp */,
                                65621E6C089E859700760F35 /* property_slot.h */,
                                938772E5038BFE19008635CE /* array_instance.h */,
                                65DFC93508EA173A00F7300B /* HashTraits.h in Headers */,
                                6557E8F808EA5D4D0049CDFC /* HashMapPtrSpec.h in Headers */,
                                65D7D19C08F10B5B0015ABD8 /* FastMallocInternal.h in Headers */,
+                               65EA4C9C092AF9E20093D800 /* JSLock.h in Headers */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
                                65E217BF08E7EECC0023E5F6 /* FastMalloc.cpp in Sources */,
                                6541BD7408E80A17002CBEE7 /* TCSystemAlloc.cpp in Sources */,
                                65DFC93308EA173A00F7300B /* HashTable.cpp in Sources */,
+                               65EA4C9B092AF9E20093D800 /* JSLock.cpp in Sources */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
diff --git a/JavaScriptCore/kjs/JSLock.cpp b/JavaScriptCore/kjs/JSLock.cpp
new file mode 100644 (file)
index 0000000..67290f3
--- /dev/null
@@ -0,0 +1,104 @@
+// -*- mode: c++; c-basic-offset: 4 -*-
+/*
+ * This file is part of the KDE libraries
+ * Copyright (C) 2005 Apple Computer, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ */
+
+#include "config.h"
+#include "JSLock.h"
+
+#include "collector.h"
+
+namespace KJS {
+
+#if KJS_MULTIPLE_THREADS
+
+static pthread_once_t interpreterLockOnce = PTHREAD_ONCE_INIT;
+static pthread_mutex_t interpreterLock;
+static int interpreterLockCount = 0;
+
+static void initializeInterpreterLock()
+{
+  pthread_mutexattr_t attr;
+
+  pthread_mutexattr_init(&attr);
+  pthread_mutexattr_settype (&attr, PTHREAD_MUTEX_RECURSIVE);
+
+  pthread_mutex_init(&interpreterLock, &attr);
+}
+
+void InterpreterLock::lock()
+{
+  pthread_once(&interpreterLockOnce, initializeInterpreterLock);
+  pthread_mutex_lock(&interpreterLock);
+  interpreterLockCount++;
+  Collector::registerThread();
+
+  // FIXME: Hack-o-rama. To prevent construction of a global object with a null prototype (4342216),
+  // we need to intialize our constants before the first object is constructed. InterpreterImp::lock()
+  // is a good place to do this because you have to call it before doing any allocations. Once we change our 
+  // implementation to use immediate values, we should remove this code.
+  ConstantValues::initIfNeeded();
+}
+
+void InterpreterLock::unlock()
+{
+  interpreterLockCount--;
+  pthread_mutex_unlock(&interpreterLock);
+}
+
+#else
+
+// If threading support is off, set the lock count to a constant value of 1 so assertions
+// that the lock is held don't fail
+const int interpreterLockCount = 1;
+
+void InterpreterLock::lock()
+{
+}
+
+void InterpreterLock::unlock()
+{
+}
+
+#endif
+
+int InterpreterLock::lockCount()
+{
+    return interpreterLockCount;
+}
+        
+InterpreterLock::DropAllLocks::DropAllLocks()
+{
+    int lockCount = InterpreterLock::lockCount();
+    for (int i = 0; i < lockCount; i++) {
+        InterpreterLock::unlock();
+    }
+    m_lockCount = lockCount;
+}
+
+InterpreterLock::DropAllLocks::~DropAllLocks()
+{
+    int lockCount = m_lockCount;
+    for (int i = 0; i < lockCount; i++) {
+        InterpreterLock::lock();
+    }
+}
+
+}
diff --git a/JavaScriptCore/kjs/JSLock.h b/JavaScriptCore/kjs/JSLock.h
new file mode 100644 (file)
index 0000000..762a219
--- /dev/null
@@ -0,0 +1,76 @@
+// -*- mode: c++; c-basic-offset: 4 -*-
+/*
+ * This file is part of the KDE libraries
+ * Copyright (C) 2005 Apple Computer, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ */
+
+#ifndef KJS_INTERPRETER_LOCK_H
+#define KJS_INTERPRETER_LOCK_H
+
+namespace KJS {
+
+    // to make it safe to use JavaScript on multiple threads, it is
+    // important to lock before doing anything that allocates a
+    // garbage-collected object or which may affect other shared state
+    // such as the protect count hash table. The simplest way to do
+    // this is by having a local InterpreterLock object for the scope
+    // where the lock must be held. The lock is recursive so nesting
+    // is ok.
+
+    // Sometimes it is necessary to temporarily release the lock -
+    // since it is recursive you have to actually release all locks
+    // held by your thread. This is safe to do if you are executing
+    // code that doesn't require the lock, and reacquire the right
+    // number of locks at the end. You can do this by constructing a
+    // locally scoped InterpreterLock::DropAllLocks object.
+
+    class InterpreterLock
+    {
+    public:
+        InterpreterLock() 
+        {
+            lock();
+        }
+        ~InterpreterLock() { 
+            unlock(); 
+        }
+        
+        static void lock();
+        static void unlock();
+        static int lockCount();
+        
+        class DropAllLocks {
+        public:
+            DropAllLocks();
+            ~DropAllLocks();
+        private:
+            int m_lockCount;
+            
+            DropAllLocks(const DropAllLocks&);
+            DropAllLocks& operator=(const DropAllLocks&);
+        };
+        
+    private:
+        InterpreterLock(const InterpreterLock&);
+        InterpreterLock& operator=(const InterpreterLock&);
+    };
+
+} // namespace
+
+#endif // KJS_INTERPRETER_LOCK_H
index 3168e04d03df068a68ee67117d71db1058ac0a2a..1d642f9f6ac64bbaf56d51292a44aafe87f78b8c 100644 (file)
@@ -106,7 +106,7 @@ bool Collector::memoryFull = false;
 
 void* Collector::allocate(size_t s)
 {
-  assert(Interpreter::lockCount() > 0);
+  assert(InterpreterLock::lockCount() > 0);
 
   // collect if needed
   size_t numLiveObjects = heap.numLiveObjects;
@@ -393,7 +393,7 @@ void Collector::markProtectedObjects()
 
 bool Collector::collect()
 {
-  assert(Interpreter::lockCount() > 0);
+  assert(InterpreterLock::lockCount() > 0);
 
   if (InterpreterImp::s_hook) {
     InterpreterImp *scr = InterpreterImp::s_hook;
index 6293ded54d11d6f9d6c8465286d41e4f4b3ea7cd..8c3872595a8046663aa433c8ab43c5993691bcb0 100644 (file)
@@ -10,6 +10,8 @@
 #define HAVE_SYS_TIME_H 1
 #define HAVE_SYS_TIMEB_H 1
 
+#define KJS_MULTIPLE_THREADS 1
+
 #elif WIN32
 
 #define HAVE_FLOAT_H 1
index cad5db2384cfe62158f966a08378227bd942ceae..a70234b9acb244aa9aedc606a2d337ba34459085 100644 (file)
@@ -74,46 +74,6 @@ namespace KJS {
  
 #endif // APPLE_CHANGES
 
-#if defined(KJS_MULTIPLE_THREADS) && KJS_MULTIPLE_THREADS
-
-static pthread_once_t interpreterLockOnce = PTHREAD_ONCE_INIT;
-static pthread_mutex_t interpreterLock;
-static int interpreterLockCount = 0;
-
-static void initializeInterpreterLock()
-{
-  pthread_mutexattr_t attr;
-
-  pthread_mutexattr_init(&attr);
-  pthread_mutexattr_settype (&attr, PTHREAD_MUTEX_RECURSIVE);
-
-  pthread_mutex_init(&interpreterLock, &attr);
-}
-
-static inline void lockInterpreter()
-{
-  pthread_once(&interpreterLockOnce, initializeInterpreterLock);
-  pthread_mutex_lock(&interpreterLock);
-  interpreterLockCount++;
-  Collector::registerThread();
-}
-
-static inline void unlockInterpreter()
-{
-  interpreterLockCount--;
-  pthread_mutex_unlock(&interpreterLock);
-}
-
-#else
-
-static inline void initializeInterpreterLock() { }
-static inline void lockInterpreter() { }
-static inline void unlockInterpreter() { }
-
-const int interpreterLockCount = 1;
-
-#endif
-
 // ------------------------------ UndefinedImp ---------------------------------
 
 ValueImp *UndefinedImp::toPrimitive(ExecState *, Type) const
@@ -473,27 +433,6 @@ InterpreterImp::InterpreterImp(Interpreter *interp, ObjectImp *glob)
   recursion = 0;
 }
 
-void InterpreterImp::lock()
-{
-  lockInterpreter();
-
-  // FIXME: Hack-o-rama. To prevent construction of a global object with a null prototype (4342216),
-  // we need to intialize our constants before the first object is constructed. InterpreterImp::lock()
-  // is a good place to do this because you have to call it before doing any allocations. Once we change our 
-  // implementation to use immediate values, we should remove this code.
-  ConstantValues::initIfNeeded();
-}
-
-int InterpreterImp::lockCount()
-{
-  return interpreterLockCount;
-}
-
-void InterpreterImp::unlock()
-{
-  unlockInterpreter();
-}
-
  void InterpreterImp::initGlobalObject()
 {
   Identifier::init();
index 58c69df6d37b687c11b1d3cbf10141f61c655159..ee5c3a122f6af43070f165b3f6e8f0e992cd2063 100644 (file)
 #include "scope_chain.h"
 #include <kxmlcore/SharedPtr.h>
 
-#if __APPLE__
-#define KJS_MULTIPLE_THREADS 1
-#endif
-
 #define I18N_NOOP(s) s
 
 namespace KJS {
@@ -253,9 +249,6 @@ namespace KJS {
     Interpreter *interpreter() const { return m_interpreter; }
 
     void initGlobalObject();
-    static void lock();
-    static void unlock();
-    static int lockCount();
 
     void mark();
 
index 067c06d76a14de1cd7a649fb8240e9ba3f59ad26..0cd81b2f853598d4da987d943f72978d39fb33bb 100644 (file)
@@ -99,21 +99,6 @@ void Interpreter::initGlobalObject()
   rep->initGlobalObject();
 }
 
-void Interpreter::lock()
-{
-  InterpreterImp::lock();
-}
-
-void Interpreter::unlock()
-{
-  InterpreterImp::unlock();
-}
-
-int Interpreter::lockCount()
-{
-  return InterpreterImp::lockCount();
-}
-
 ExecState *Interpreter::globalExec()
 {
   return rep->globalExec();
index 20e4f520d1e91740c983a55392315792719ddedb..965cd24d8a804d170d9ace6a207a3057e2019d3c 100644 (file)
@@ -167,10 +167,6 @@ namespace KJS {
 
     void initGlobalObject();
 
-    static void lock();
-    static void unlock();
-    static int lockCount();
-
     /**
      * Returns the execution state object which can be used to execute
      * scripts using this interpreter at a the "global" level, i.e. one
@@ -482,16 +478,6 @@ namespace KJS {
     ValueImp *_exception;
   };
 
-    class InterpreterLock
-    {
-    public:
-        InterpreterLock() { Interpreter::lock(); }
-        ~InterpreterLock() { Interpreter::unlock(); }
-    private:
-        InterpreterLock(const InterpreterLock &);
-        InterpreterLock &operator =(const InterpreterLock &);
-    };
-
 } // namespace
 
 #endif // _KJS_INTERPRETER_H_
index 30897d6145763a0543f856b20c882f6fc562f6de..8cdab3665bc9f803f409ad98b68a812be93207e8 100644 (file)
@@ -27,7 +27,7 @@
 #include "reference.h"
 #include "value.h"
 #include "protected_values.h"
-#include "interpreter.h"
+#include "JSLock.h"
 
 namespace KJS {
 
index d5bc29aa1c8419865f60d095547cb67d1bf6ab2b..30f2bb762b51b25234c61ec234694510fc1b2cd1 100644 (file)
@@ -42,7 +42,7 @@ int ProtectedValues::_keyCount;
 int ProtectedValues::getProtectCount(ValueImp *k)
 {
     assert(k);
-    assert(InterpreterImp::lockCount() > 0);
+    assert(InterpreterLock::lockCount() > 0);
 
     if (!_table)
        return 0;
@@ -71,7 +71,7 @@ int ProtectedValues::getProtectCount(ValueImp *k)
 void ProtectedValues::increaseProtectCount(ValueImp *k)
 {
     assert(k);
-    assert(InterpreterImp::lockCount() > 0);
+    assert(InterpreterLock::lockCount() > 0);
 
     if (SimpleNumber::is(k))
       return;
@@ -121,7 +121,7 @@ inline void ProtectedValues::insert(AllocatedValueImp *k, int v)
 void ProtectedValues::decreaseProtectCount(ValueImp *k)
 {
     assert(k);
-    assert(InterpreterImp::lockCount() > 0);
+    assert(InterpreterLock::lockCount() > 0);
 
     if (SimpleNumber::is(k))
       return;
index d749f61793c53e868bc56f7c02e049f44f9908dc..9f3619557fd80947637c0136be7412cc5d8ddd61 100644 (file)
@@ -31,6 +31,7 @@
 #include "types.h"
 #include "interpreter.h"
 #include "collector.h"
+#include "JSLock.h"
 
 using namespace KJS;
 
@@ -62,9 +63,10 @@ ValueImp *TestFunctionImp::callAsFunction(ExecState *exec, ObjectImp */*thisObj*
     exit(0);
     return Undefined();
   case GC:
-    Interpreter::lock();
+  {
+    InterpreterLock lock;
     Collector::collect();
-    Interpreter::unlock();
+  }
     break;
   default:
     break;
index 93f48846825dc504c707fb08bce16b9275260384..6848381d00c4dabc33ac4b4a62077ffbbb84eaaa 100644 (file)
@@ -1,3 +1,15 @@
+2005-11-16  Maciej Stachowiak  <mjs@apple.com>
+
+        Reviewed by Geoff.
+
+       <rdar://problem/4139620> Seed: WebKit: hang when sending XMLHttpRequest if automatic proxy config is used
+
+        * khtml/ecma/kjs_events.cpp:
+        (KJS::JSLazyEventListener::parseCode):
+        * khtml/ecma/xmlhttprequest.cpp:
+        (KJS::XMLHttpRequest::send):
+        * kwq/WebCoreJavaScript.mm:
+
 2005-11-22  eseidel  <eseidel@apple.com>
 
         No review required, svg target only.
index 5516fa9566e58457b36ca5622288e0308b26258e..40582bd5716e5521b9068a22183636dc3b94c419 100644 (file)
@@ -319,11 +319,13 @@ void JSLazyEventListener::parseCode() const
         // Add the event's home element to the scope
         // (and the document, and the form - see HTMLElement::eventHandlerScope)
         ScopeChain scope = listener->scope();
-        
-        Interpreter::lock();
-        ObjectImp *thisObj = static_cast<ObjectImp *>(getDOMNode(exec, originalNode));
-        Interpreter::unlock();
-        
+
+        ObjectImp *thisObj;
+        { // scope
+            InterpreterLock lock;
+            thisObj = static_cast<ObjectImp *>(getDOMNode(exec, originalNode));
+        }
+
         if (thisObj) {
           static_cast<DOMNode*>(thisObj)->pushEventHandlerScope(exec, scope);
           listener->setScope(scope);
index dd8c1b3fd74f91f000f657ce40c9caf21eb615b5..b11aff2f6dab2e499a92bc60c5119c76bec6962b 100644 (file)
@@ -346,7 +346,13 @@ void XMLHttpRequest::send(const QString& _body)
     KURL finalURL;
     QString headers;
 
-    data = KWQServeSynchronousRequest(khtml::Cache::loader(), doc->docLoader(), job, finalURL, headers);
+    { // scope
+        // avoid deadlock in case the loader wants to use JS on a background thread
+        InterpreterLock::DropAllLocks dropLocks;
+
+        data = KWQServeSynchronousRequest(khtml::Cache::loader(), doc->docLoader(), job, finalURL, headers);
+    }
+
     job = 0;
     processSyncLoadResults(data, finalURL, headers);
     
index d571587c3c14fb701f546b2644511b0d78bf0e7d..42503d57603766a312d8248e024e43aca7067757 100644 (file)
@@ -28,6 +28,7 @@
 
 #import <JavaScriptCore/collector.h>
 #import <JavaScriptCore/interpreter.h>
+#import <JavaScriptCore/JSLock.h>
 
 using KJS::Collector;
 using KJS::Interpreter;