Changeset 128704 in webkit for trunk/Source/JavaScriptCore


Ignore:
Timestamp:
Sep 15, 2012, 11:08:18 PM (13 years ago)
Author:
[email protected]
Message:

Fixed JSLock to use the platform abstraction for Mutex instead of
depending on pthreads.
https://bugs.webkit.org/show_bug.cgi?id=96858.

Reviewed by Filip Pizlo.

This fixes a synchronization problem on the Windows port and makes
it more reliable when running the layout tests.

  • runtime/InitializeThreading.cpp:

(JSC::initializeThreadingOnce):

  • runtime/JSLock.cpp:

(JSC):
(JSC::GlobalJSLock::GlobalJSLock):
(JSC::GlobalJSLock::~GlobalJSLock):
(JSC::GlobalJSLock::initialize):

  • runtime/JSLock.h:

(GlobalJSLock):
(JSLock):

Location:
trunk/Source/JavaScriptCore
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r128699 r128704  
     12012-09-15  Mark Lam  <[email protected]>
     2
     3        Fixed JSLock to use the platform abstraction for Mutex instead of
     4        depending on pthreads.
     5        https://bugs.webkit.org/show_bug.cgi?id=96858.
     6
     7        Reviewed by Filip Pizlo.
     8
     9        This fixes a synchronization problem on the Windows port and makes
     10        it more reliable when running the layout tests.
     11
     12        * runtime/InitializeThreading.cpp:
     13        (JSC::initializeThreadingOnce):
     14        * runtime/JSLock.cpp:
     15        (JSC):
     16        (JSC::GlobalJSLock::GlobalJSLock):
     17        (JSC::GlobalJSLock::~GlobalJSLock):
     18        (JSC::GlobalJSLock::initialize):
     19        * runtime/JSLock.h:
     20        (GlobalJSLock):
     21        (JSLock):
     22
    1232012-09-15  Filip Pizlo  <[email protected]>
    224
  • trunk/Source/JavaScriptCore/runtime/InitializeThreading.cpp

    r127191 r128704  
    3636#include "JSDateMath.h"
    3737#include "JSGlobalObject.h"
     38#include "JSLock.h"
    3839#include "LLIntData.h"
    3940#include "WriteBarrier.h"
     
    5455    WTF::double_conversion::initialize();
    5556    WTF::initializeThreading();
     57    GlobalJSLock::initialize();
    5658    Options::initialize();
    5759#if ENABLE(WRITE_BARRIER_PROFILING)
  • trunk/Source/JavaScriptCore/runtime/JSLock.cpp

    r127202 r128704  
    3434namespace JSC {
    3535
    36 // JSLock is only needed to support an obsolete execution model where JavaScriptCore
    37 // automatically protected against concurrent access from multiple threads.
    38 // So it's safe to disable it on non-mac platforms where we don't have native pthreads.
    39 #if (OS(DARWIN) || USE(PTHREADS))
    40 
    41 static pthread_mutex_t sharedInstanceLock = PTHREAD_MUTEX_INITIALIZER;
     36Mutex* GlobalJSLock::s_sharedInstanceLock = 0;
    4237
    4338GlobalJSLock::GlobalJSLock()
    4439{
    45     pthread_mutex_lock(&sharedInstanceLock);
     40    s_sharedInstanceLock->lock();
    4641}
    4742
    4843GlobalJSLock::~GlobalJSLock()
    4944{
    50     pthread_mutex_unlock(&sharedInstanceLock);
     45    s_sharedInstanceLock->unlock();
     46}
     47
     48void GlobalJSLock::initialize()
     49{
     50    s_sharedInstanceLock = new Mutex();
    5151}
    5252
     
    217217}
    218218
    219 #else // (OS(DARWIN) || USE(PTHREADS))
    220 
    221 GlobalJSLock::GlobalJSLock()
    222 {
    223 }
    224 
    225 GlobalJSLock::~GlobalJSLock()
    226 {
    227 }
    228 
    229 JSLockHolder::JSLockHolder(JSGlobalData*)
    230 {
    231 }
    232 
    233 JSLockHolder::JSLockHolder(JSGlobalData&)
    234 {
    235 }
    236 
    237 JSLockHolder::JSLockHolder(ExecState*)
    238 {
    239 }
    240 
    241 JSLockHolder::~JSLockHolder()
    242 {
    243 }
    244 
    245 JSLock::JSLock()
    246 {
    247 }
    248 
    249 JSLock::~JSLock()
    250 {
    251 }
    252 
    253 bool JSLock::currentThreadIsHoldingLock()
    254 {
    255     return true;
    256 }
    257 
    258 void JSLock::lock()
    259 {
    260 }
    261 
    262 void JSLock::unlock()
    263 {
    264 }
    265 
    266 void JSLock::lock(ExecState*)
    267 {
    268 }
    269 
    270 void JSLock::unlock(ExecState*)
    271 {
    272 }
    273 
    274 void JSLock::lock(JSGlobalData&)
    275 {
    276 }
    277 
    278 void JSLock::unlock(JSGlobalData&)
    279 {
    280 }
    281 
    282 unsigned JSLock::dropAllLocks()
    283 {
    284     return 0;
    285 }
    286 
    287 unsigned JSLock::dropAllLocksUnconditionally()
    288 {
    289     return 0;
    290 }
    291 
    292 void JSLock::grabAllLocks(unsigned)
    293 {
    294 }
    295 
    296 JSLock::DropAllLocks::DropAllLocks(ExecState*)
    297 {
    298 }
    299 
    300 JSLock::DropAllLocks::DropAllLocks(JSGlobalData*)
    301 {
    302 }
    303 
    304 JSLock::DropAllLocks::~DropAllLocks()
    305 {
    306 }
    307 
    308 #endif // (OS(DARWIN) || USE(PTHREADS))
    309 
    310219} // namespace JSC
  • trunk/Source/JavaScriptCore/runtime/JSLock.h

    r121381 r128704  
    5959        JS_EXPORT_PRIVATE GlobalJSLock();
    6060        JS_EXPORT_PRIVATE ~GlobalJSLock();
     61
     62        static void initialize();
     63    private:
     64        static Mutex* s_sharedInstanceLock;
    6165    };
    6266
     
    9296        void grabAllLocks(unsigned lockCount);
    9397
    94         SpinLock m_spinLock;
    95         Mutex m_lock;
    96         ThreadIdentifier m_ownerThread;
    97         intptr_t m_lockCount;
    98         unsigned m_lockDropDepth;
    99 
    10098        class DropAllLocks {
    10199            WTF_MAKE_NONCOPYABLE(DropAllLocks);
     
    109107            RefPtr<JSGlobalData> m_globalData;
    110108        };
     109
     110    private:
     111        SpinLock m_spinLock;
     112        Mutex m_lock;
     113        ThreadIdentifier m_ownerThread;
     114        intptr_t m_lockCount;
     115        unsigned m_lockDropDepth;
    111116    };
    112117
Note: See TracChangeset for help on using the changeset viewer.