Changeset 20104 in webkit for trunk/JavaScriptCore/kjs/JSLock.cpp
- Timestamp:
- Mar 11, 2007, 4:57:11 PM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/kjs/JSLock.cpp
r13089 r20104 30 30 #if USE(MULTIPLE_THREADS) 31 31 32 static pthread_once_t interpreterLockOnce = PTHREAD_ONCE_INIT; 33 static pthread_mutex_t interpreterLock; 34 static int interpreterLockCount = 0; 32 // Acquire this mutex before accessing lock-related data. 33 static pthread_mutex_t JSMutex = PTHREAD_MUTEX_INITIALIZER; 35 34 36 static void initializeJSLock() 35 // Thread-specific key that tells whether a thread holds the JSMutex. 36 pthread_key_t didLockJSMutex; 37 38 // Lock nesting count. 39 static int JSLockCount; 40 41 static void createDidLockJSMutex() 37 42 { 38 pthread_mutexattr_t attr; 39 40 pthread_mutexattr_init(&attr); 41 pthread_mutexattr_settype (&attr, PTHREAD_MUTEX_RECURSIVE); 42 43 pthread_mutex_init(&interpreterLock, &attr); 43 pthread_key_create(&didLockJSMutex, 0); 44 44 } 45 pthread_once_t createDidLockJSMutexOnce = PTHREAD_ONCE_INIT; 45 46 46 47 void JSLock::lock() 47 48 { 48 pthread_once(&interpreterLockOnce, initializeJSLock); 49 pthread_mutex_lock(&interpreterLock); 50 interpreterLockCount++; 51 Collector::registerThread(); 49 pthread_once(&createDidLockJSMutexOnce, createDidLockJSMutex); 50 51 if (!pthread_getspecific(didLockJSMutex)) { 52 pthread_mutex_lock(&JSMutex); 53 pthread_setspecific(didLockJSMutex, &didLockJSMutex); 54 } 55 ++JSLockCount; 56 57 Collector::registerThread(); 52 58 } 53 59 54 60 void JSLock::unlock() 55 61 { 56 interpreterLockCount--; 57 pthread_mutex_unlock(&interpreterLock); 62 ASSERT(JSLockCount); 63 ASSERT(!!pthread_getspecific(didLockJSMutex)); 64 65 --JSLockCount; 66 if (!JSLockCount) { 67 pthread_setspecific(didLockJSMutex, 0); 68 pthread_mutex_unlock(&JSMutex); 69 } 70 } 71 72 JSLock::DropAllLocks::DropAllLocks() 73 : m_lockCount(0) 74 { 75 pthread_once(&createDidLockJSMutexOnce, createDidLockJSMutex); 76 77 m_lockCount = !!pthread_getspecific(didLockJSMutex) ? JSLock::lockCount() : 0; 78 for (int i = 0; i < m_lockCount; i++) 79 JSLock::unlock(); 80 } 81 82 JSLock::DropAllLocks::~DropAllLocks() 83 { 84 for (int i = 0; i < m_lockCount; i++) 85 JSLock::lock(); 86 m_lockCount = 0; 58 87 } 59 88 … … 62 91 // If threading support is off, set the lock count to a constant value of 1 so assertions 63 92 // that the lock is held don't fail 64 const int interpreterLockCount = 1;93 const int JSLockCount = 1; 65 94 66 95 void JSLock::lock() … … 72 101 } 73 102 74 #endif75 76 int JSLock::lockCount()77 {78 return interpreterLockCount;79 }80 81 103 JSLock::DropAllLocks::DropAllLocks() 82 104 { 83 int lockCount = JSLock::lockCount();84 for (int i = 0; i < lockCount; i++) {85 JSLock::unlock();86 }87 m_lockCount = lockCount;88 105 } 89 106 90 107 JSLock::DropAllLocks::~DropAllLocks() 91 108 { 92 int lockCount = m_lockCount; 93 for (int i = 0; i < lockCount; i++) { 94 JSLock::lock(); 95 } 109 } 110 111 #endif // USE(MULTIPLE_THREADS) 112 113 int JSLock::lockCount() 114 { 115 return JSLockCount; 96 116 } 97 117
Note:
See TracChangeset
for help on using the changeset viewer.