Changeset 43663 in webkit
- Timestamp:
- May 13, 2009 3:09:21 PM (15 years ago)
- Location:
- trunk
- Files:
-
- 23 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/ChangeLog
r43661 r43663 1 2009-05-13 Dmitry Titov <dimich@chromium.org> 2 3 Rubber-stamped by Mark Rowe. 4 5 https://bugs.webkit.org/show_bug.cgi?id=25746 6 Revert http://trac.webkit.org/changeset/43507 which caused crash in PPC nightlies with Safari 4. 7 8 * JavaScriptCore.exp: 9 * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: 10 * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: 11 * bytecode/SamplingTool.cpp: 12 (JSC::SamplingThread::start): 13 (JSC::SamplingThread::stop): 14 * bytecode/SamplingTool.h: 15 * wtf/CrossThreadRefCounted.h: 16 (WTF::CrossThreadRefCounted::CrossThreadRefCounted): 17 (WTF::::ref): 18 (WTF::::deref): 19 * wtf/Threading.h: 20 * wtf/ThreadingNone.cpp: 21 * wtf/ThreadingPthreads.cpp: 22 (WTF::threadMapMutex): 23 (WTF::initializeThreading): 24 (WTF::threadMap): 25 (WTF::identifierByPthreadHandle): 26 (WTF::establishIdentifierForPthreadHandle): 27 (WTF::pthreadHandleForIdentifier): 28 (WTF::clearPthreadHandleForIdentifier): 29 (WTF::createThreadInternal): 30 (WTF::waitForThreadCompletion): 31 (WTF::detachThread): 32 (WTF::currentThread): 33 * wtf/ThreadingWin.cpp: 34 (WTF::threadMapMutex): 35 (WTF::initializeThreading): 36 (WTF::threadMap): 37 (WTF::storeThreadHandleByIdentifier): 38 (WTF::threadHandleForIdentifier): 39 (WTF::clearThreadHandleForIdentifier): 40 (WTF::createThreadInternal): 41 (WTF::waitForThreadCompletion): 42 (WTF::detachThread): 43 (WTF::currentThread): 44 * wtf/gtk/ThreadingGtk.cpp: 45 (WTF::threadMapMutex): 46 (WTF::initializeThreading): 47 (WTF::threadMap): 48 (WTF::identifierByGthreadHandle): 49 (WTF::establishIdentifierForThread): 50 (WTF::threadForIdentifier): 51 (WTF::clearThreadForIdentifier): 52 (WTF::createThreadInternal): 53 (WTF::waitForThreadCompletion): 54 (WTF::currentThread): 55 * wtf/qt/ThreadingQt.cpp: 56 (WTF::threadMapMutex): 57 (WTF::threadMap): 58 (WTF::identifierByQthreadHandle): 59 (WTF::establishIdentifierForThread): 60 (WTF::clearThreadForIdentifier): 61 (WTF::threadForIdentifier): 62 (WTF::initializeThreading): 63 (WTF::createThreadInternal): 64 (WTF::waitForThreadCompletion): 65 (WTF::currentThread): 66 1 67 2009-05-13 Darin Adler <darin@apple.com> 2 68 -
trunk/JavaScriptCore/JavaScriptCore.exp
r43661 r43663 281 281 __ZN3WTF12createThreadEPFPvS0_ES0_ 282 282 __ZN3WTF12createThreadEPFPvS0_ES0_PKc 283 __ZN3WTF12detachThreadE NS_16ThreadIdentifierE283 __ZN3WTF12detachThreadEj 284 284 __ZN3WTF12isMainThreadEv 285 285 __ZN3WTF12randomNumberEv … … 302 302 __ZN3WTF21RefCountedLeakCounterC1EPKc 303 303 __ZN3WTF21RefCountedLeakCounterD1Ev 304 __ZN3WTF23waitForThreadCompletionE NS_16ThreadIdentifierEPPv304 __ZN3WTF23waitForThreadCompletionEjPPv 305 305 __ZN3WTF27releaseFastMallocFreeMemoryEv 306 306 __ZN3WTF28setMainThreadCallbacksPausedEb … … 364 364 __ZNK3JSC9HashTable11deleteTableEv 365 365 __ZNK3WTF8Collator7collateEPKtmS2_m 366 __ZNK3WTF16ThreadIdentifiereqERKS0_367 __ZNK3WTF16ThreadIdentifierneERKS0_368 366 __ZTVN3JSC12StringObjectE 369 367 __ZTVN3JSC14JSGlobalObjectE -
trunk/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def
r43661 r43663 33 33 ??4UString@JSC@@QAEAAV01@PBD@Z 34 34 ??8JSC@@YA_NABVUString@0@0@Z 35 ??8ThreadIdentifier@WTF@@QBE_NABV01@@Z36 35 ?UTF8String@UString@JSC@@QBE?AVCString@2@_N@Z 37 36 ?add@Identifier@JSC@@SA?AV?$PassRefPtr@URep@UString@JSC@@@WTF@@PAVExecState@2@PBD@Z … … 76 75 ?createStructure@JSByteArray@JSC@@SA?AV?$PassRefPtr@VStructure@JSC@@@WTF@@VJSValue@2@@Z 77 76 ?createTable@HashTable@JSC@@ABEXPAVJSGlobalData@2@@Z 78 ?createThread@WTF@@YA?AVThreadIdentifier@1@P6APAXPAX@Z0PBD@Z 79 ?currentThread@WTF@@YA?AVThreadIdentifier@1@XZ 77 ?createThread@WTF@@YAIP6APAXPAX@Z0@Z 78 ?createThread@WTF@@YAIP6APAXPAX@Z0PBD@Z 79 ?currentThread@WTF@@YAIXZ 80 80 ?currentTime@WTF@@YANXZ 81 81 ?decrement@RefCountedLeakCounter@WTF@@QAEXXZ … … 97 97 ?destroy@Rep@UString@JSC@@QAEXXZ 98 98 ?detach@Debugger@JSC@@QAEXPAVJSGlobalObject@2@@Z 99 ?detachThread@WTF@@YAX VThreadIdentifier@1@@Z99 ?detachThread@WTF@@YAXI@Z 100 100 ?equal@Identifier@JSC@@SA_NPBURep@UString@2@PBD@Z 101 101 ?equal@JSC@@YA_NPBURep@UString@1@0@Z … … 255 255 ?unwrappedObject@JSObject@JSC@@UAEPAV12@XZ 256 256 ?wait@ThreadCondition@WTF@@QAEXAAVMutex@2@@Z 257 ?waitForThreadCompletion@WTF@@YAH VThreadIdentifier@1@PAPAX@Z257 ?waitForThreadCompletion@WTF@@YAHIPAPAX@Z 258 258 WTFLog 259 259 WTFLogVerbose … … 266 266 ?setDumpsGeneratedCode@BytecodeGenerator@JSC@@SAX_N@Z 267 267 ?putDirectFunction@JSObject@JSC@@QAEXPAVExecState@2@PAVInternalFunction@2@I@Z 268 ?createThreadDeprecated@WTF@@YAIP6APAXPAX@Z0PBD@Z269 ?currentThreadDeprecated@WTF@@YAIXZ270 ?detachThreadDeprecated@WTF@@YAXI@Z271 ?waitForThreadCompletionDeprecated@WTF@@YAHIPAPAX@Z -
trunk/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def
r43661 r43663 33 33 ??4UString@JSC@@QAEAAV01@PBD@Z 34 34 ??8JSC@@YA_NABVUString@0@0@Z 35 ??8ThreadIdentifier@WTF@@QBE_NABV01@@Z36 35 ?UTF8String@UString@JSC@@QBE?AVCString@2@_N@Z 37 36 ?add@Identifier@JSC@@SA?AV?$PassRefPtr@URep@UString@JSC@@@WTF@@PAVExecState@2@PBD@Z … … 76 75 ?createStructure@JSByteArray@JSC@@SA?AV?$PassRefPtr@VStructure@JSC@@@WTF@@VJSValue@2@@Z 77 76 ?createTable@HashTable@JSC@@ABEXPAVJSGlobalData@2@@Z 78 ?createThread@WTF@@YA?AVThreadIdentifier@1@P6APAXPAX@Z0PBD@Z 79 ?currentThread@WTF@@YA?AVThreadIdentifier@1@XZ 77 ?createThread@WTF@@YAIP6APAXPAX@Z0@Z 78 ?createThread@WTF@@YAIP6APAXPAX@Z0PBD@Z 79 ?currentThread@WTF@@YAIXZ 80 80 ?currentTime@WTF@@YANXZ 81 81 ?decrement@RefCountedLeakCounter@WTF@@QAEXXZ … … 97 97 ?destroy@Rep@UString@JSC@@QAEXXZ 98 98 ?detach@Debugger@JSC@@QAEXPAVJSGlobalObject@2@@Z 99 ?detachThread@WTF@@YAX VThreadIdentifier@1@@Z99 ?detachThread@WTF@@YAXI@Z 100 100 ?equal@Identifier@JSC@@SA_NPBURep@UString@2@PBD@Z 101 101 ?equal@JSC@@YA_NPBURep@UString@1@0@Z … … 255 255 ?unwrappedObject@JSObject@JSC@@UAEPAV12@XZ 256 256 ?wait@ThreadCondition@WTF@@QAEXAAVMutex@2@@Z 257 ?waitForThreadCompletion@WTF@@YAH VThreadIdentifier@1@PAPAX@Z257 ?waitForThreadCompletion@WTF@@YAHIPAPAX@Z 258 258 WTFLog 259 259 WTFLogVerbose … … 266 266 ?setDumpsGeneratedCode@BytecodeGenerator@JSC@@SAX_N@Z 267 267 ?putDirectFunction@JSObject@JSC@@QAEXPAVExecState@2@PAVInternalFunction@2@I@Z 268 ?createThreadDeprecated@WTF@@YAIP6APAXPAX@Z0PBD@Z269 ?currentThreadDeprecated@WTF@@YAIXZ270 ?detachThreadDeprecated@WTF@@YAXI@Z271 ?waitForThreadCompletionDeprecated@WTF@@YAHIPAPAX@Z -
trunk/JavaScriptCore/bytecode/SamplingTool.cpp
r43619 r43663 122 122 bool SamplingThread::s_running = false; 123 123 unsigned SamplingThread::s_hertz = 10000; 124 125 ThreadIdentifier& SamplingThread::samplingThread() { 126 DEFINE_STATIC_LOCAL(ThreadIdentifier, staticSamplingThread, ()); 127 return staticSamplingThread; 128 } 124 ThreadIdentifier SamplingThread::s_samplingThread; 129 125 130 126 void* SamplingThread::threadStartFunc(void*) … … 151 147 s_hertz = hertz; 152 148 153 s amplingThread()= createThread(threadStartFunc, 0, "JavaScriptCore::Sampler");149 s_samplingThread = createThread(threadStartFunc, 0, "JavaScriptCore::Sampler"); 154 150 } 155 151 … … 158 154 ASSERT(s_running); 159 155 s_running = false; 160 waitForThreadCompletion(s amplingThread(), 0);156 waitForThreadCompletion(s_samplingThread, 0); 161 157 } 162 158 -
trunk/JavaScriptCore/bytecode/SamplingTool.h
r43619 r43663 127 127 static bool s_running; 128 128 static unsigned s_hertz; 129 130 static ThreadIdentifier& samplingThread(); 129 static ThreadIdentifier s_samplingThread; 131 130 132 131 static void start(unsigned hertz=10000); -
trunk/JavaScriptCore/wtf/CrossThreadRefCounted.h
r43507 r43663 75 75 : m_threadSafeRefCounter(threadedCounter) 76 76 , m_data(data) 77 #ifndef NDEBUG 78 , m_threadId(0) 79 #endif 77 80 { 78 81 } … … 97 100 void CrossThreadRefCounted<T>::ref() 98 101 { 99 ASSERT(!m_threadId .isValid()|| m_threadId == currentThread());102 ASSERT(!m_threadId || m_threadId == currentThread()); 100 103 m_refCounter.ref(); 101 104 #ifndef NDEBUG … … 105 108 // is a heuristic but it seems to always work and has helped 106 109 // find some bugs. 107 if (!m_threadId .isValid()&& m_refCounter.refCount() == 2)110 if (!m_threadId && m_refCounter.refCount() == 2) 108 111 m_threadId = currentThread(); 109 112 #endif … … 113 116 void CrossThreadRefCounted<T>::deref() 114 117 { 115 ASSERT(!m_threadId .isValid()|| m_threadId == currentThread());118 ASSERT(!m_threadId || m_threadId == currentThread()); 116 119 if (m_refCounter.derefBase()) { 117 120 threadSafeDeref(); … … 122 125 // is safe to be passed to another thread at this point. 123 126 if (m_threadId && m_refCounter.refCount() == 1) 124 m_threadId .invalidate();127 m_threadId = 0; 125 128 #endif 126 129 } -
trunk/JavaScriptCore/wtf/Threading.h
r43507 r43663 86 86 typedef struct _GMutex GMutex; 87 87 typedef struct _GCond GCond; 88 typedef struct _GThread GThread;89 88 #endif 90 89 … … 93 92 QT_BEGIN_NAMESPACE 94 93 class QMutex; 95 class QThread;96 94 class QWaitCondition; 97 95 QT_END_NAMESPACE … … 108 106 namespace WTF { 109 107 108 typedef uint32_t ThreadIdentifier; 109 typedef void* (*ThreadFunction)(void* argument); 110 111 // Returns 0 if thread creation failed. 112 // The thread name must be a literal since on some platforms it's passed in to the thread. 113 ThreadIdentifier createThread(ThreadFunction, void*, const char* threadName); 114 115 // Internal platform-specific createThread implementation. 116 ThreadIdentifier createThreadInternal(ThreadFunction, void*, const char* threadName); 117 118 // Called in the thread during initialization. 119 // Helpful for platforms where the thread name must be set from within the thread. 120 void setThreadNameInternal(const char* threadName); 121 122 ThreadIdentifier currentThread(); 123 bool isMainThread(); 124 int waitForThreadCompletion(ThreadIdentifier, void**); 125 void detachThread(ThreadIdentifier); 126 110 127 #if USE(PTHREADS) 111 128 typedef pthread_mutex_t PlatformMutex; 112 129 typedef pthread_cond_t PlatformCondition; 113 typedef pthread_t PlatformThreadIdentifier;114 130 #elif PLATFORM(GTK) 115 131 typedef GOwnPtr<GMutex> PlatformMutex; 116 132 typedef GOwnPtr<GCond> PlatformCondition; 117 typedef GThread* PlatformThreadIdentifier;118 133 #elif PLATFORM(QT) 119 134 typedef QT_PREPEND_NAMESPACE(QMutex)* PlatformMutex; 120 135 typedef QT_PREPEND_NAMESPACE(QWaitCondition)* PlatformCondition; 121 typedef QT_PREPEND_NAMESPACE(QThread)* PlatformThreadIdentifier;122 136 #elif PLATFORM(WIN_OS) 123 137 struct PlatformMutex { … … 136 150 void signal(bool unblockAll); 137 151 }; 138 typedef unsigned PlatformThreadIdentifier;139 152 #else 140 153 typedef void* PlatformMutex; … … 142 155 #endif 143 156 144 // Platform-independent wrapper for thread id. Assignable and copyable.145 // A valid ThreadIdentifier is usually returned from createThread(...) or currentThread() functions.146 // ThreadIdentifier remains valid for as long as its thread is alive and is not automatically invalidated147 // when thread terminates. Since platform-dependent thread ids can be recycled, stale ThreadIdentifier148 // may reference a completely unrelated thread after its original thread terminates.149 class ThreadIdentifier {150 public:151 ThreadIdentifier()152 : m_platformId(0)153 {154 ASSERT(!isValid());155 }156 157 explicit ThreadIdentifier(PlatformThreadIdentifier platformId)158 : m_platformId(platformId)159 {160 ASSERT(isValid());161 }162 163 bool isValid() const { return m_platformId; }164 void invalidate() { m_platformId = 0; }165 166 bool operator==(const ThreadIdentifier&) const;167 bool operator!=(const ThreadIdentifier&) const;168 169 PlatformThreadIdentifier platformId() const { return m_platformId; }170 171 private:172 PlatformThreadIdentifier m_platformId;173 };174 175 typedef void* (*ThreadFunction)(void* argument);176 177 // Returns invalid identifier if thread creation failed.178 // The thread name must be a literal since on some platforms it's passed in to the thread.179 ThreadIdentifier createThread(ThreadFunction, void*, const char* threadName);180 181 // Internal platform-specific createThread implementation.182 ThreadIdentifier createThreadInternal(ThreadFunction, void*, const char* threadName);183 184 // Called in the thread during initialization.185 // Helpful for platforms where the thread name must be set from within the thread.186 void setThreadNameInternal(const char* threadName);187 188 ThreadIdentifier currentThread();189 bool isMainThread();190 int waitForThreadCompletion(ThreadIdentifier, void**);191 void detachThread(ThreadIdentifier);192 193 157 class Mutex : Noncopyable { 194 158 public: -
trunk/JavaScriptCore/wtf/ThreadingNone.cpp
r43507 r43663 33 33 namespace WTF { 34 34 35 bool ThreadIdentifier::operator==(const ThreadIdentifier&) const { return true; }36 bool ThreadIdentifier::operator!=(const ThreadIdentifier&) const { return false; }37 38 35 void initializeThreading() { } 39 36 ThreadIdentifier createThreadInternal(ThreadFunction, void*, const char*) { return ThreadIdentifier(); } -
trunk/JavaScriptCore/wtf/ThreadingPthreads.cpp
r43510 r43663 49 49 namespace WTF { 50 50 51 bool ThreadIdentifier::operator==(const ThreadIdentifier& another) const 52 { 53 return pthread_equal(m_platformId, another.m_platformId); 54 } 55 56 bool ThreadIdentifier::operator!=(const ThreadIdentifier& another) const 57 { 58 return !pthread_equal(m_platformId, another.m_platformId); 59 } 51 typedef HashMap<ThreadIdentifier, pthread_t> ThreadMap; 60 52 61 53 static Mutex* atomicallyInitializedStaticMutex; … … 65 57 #endif 66 58 59 static Mutex& threadMapMutex() 60 { 61 DEFINE_STATIC_LOCAL(Mutex, mutex, ()); 62 return mutex; 63 } 64 67 65 void initializeThreading() 68 66 { 69 67 if (!atomicallyInitializedStaticMutex) { 70 68 atomicallyInitializedStaticMutex = new Mutex; 69 threadMapMutex(); 71 70 initializeRandomNumberGenerator(); 72 71 #if !PLATFORM(DARWIN) || PLATFORM(CHROMIUM) … … 86 85 { 87 86 atomicallyInitializedStaticMutex->unlock(); 87 } 88 89 static ThreadMap& threadMap() 90 { 91 DEFINE_STATIC_LOCAL(ThreadMap, map, ()); 92 return map; 93 } 94 95 static ThreadIdentifier identifierByPthreadHandle(const pthread_t& pthreadHandle) 96 { 97 MutexLocker locker(threadMapMutex()); 98 99 ThreadMap::iterator i = threadMap().begin(); 100 for (; i != threadMap().end(); ++i) { 101 if (pthread_equal(i->second, pthreadHandle)) 102 return i->first; 103 } 104 105 return 0; 106 } 107 108 static ThreadIdentifier establishIdentifierForPthreadHandle(pthread_t& pthreadHandle) 109 { 110 ASSERT(!identifierByPthreadHandle(pthreadHandle)); 111 112 MutexLocker locker(threadMapMutex()); 113 114 static ThreadIdentifier identifierCount = 1; 115 116 threadMap().add(identifierCount, pthreadHandle); 117 118 return identifierCount++; 119 } 120 121 static pthread_t pthreadHandleForIdentifier(ThreadIdentifier id) 122 { 123 MutexLocker locker(threadMapMutex()); 124 125 return threadMap().get(id); 126 } 127 128 static void clearPthreadHandleForIdentifier(ThreadIdentifier id) 129 { 130 MutexLocker locker(threadMapMutex()); 131 132 ASSERT(threadMap().contains(id)); 133 134 threadMap().remove(id); 88 135 } 89 136 … … 118 165 if (pthread_create(&threadHandle, 0, runThreadWithRegistration, static_cast<void*>(threadData))) { 119 166 LOG_ERROR("Failed to create pthread at entry point %p with data %p", entryPoint, data); 120 return ThreadIdentifier();121 } 122 return ThreadIdentifier(threadHandle);167 return 0; 168 } 169 return establishIdentifierForPthreadHandle(threadHandle); 123 170 } 124 171 #else … … 128 175 if (pthread_create(&threadHandle, 0, entryPoint, data)) { 129 176 LOG_ERROR("Failed to create pthread at entry point %p with data %p", entryPoint, data); 130 return ThreadIdentifier();131 } 132 133 return ThreadIdentifier(threadHandle);177 return 0; 178 } 179 180 return establishIdentifierForPthreadHandle(threadHandle); 134 181 } 135 182 #endif … … 146 193 int waitForThreadCompletion(ThreadIdentifier threadID, void** result) 147 194 { 148 ASSERT(threadID .isValid());149 150 pthread_t pthreadHandle = threadID.platformId();151 195 ASSERT(threadID); 196 197 pthread_t pthreadHandle = pthreadHandleForIdentifier(threadID); 198 152 199 int joinResult = pthread_join(pthreadHandle, result); 153 200 if (joinResult == EDEADLK) 154 LOG_ERROR("ThreadIdentifier %p was found to be deadlocked trying to quit", pthreadHandle); 155 201 LOG_ERROR("ThreadIdentifier %u was found to be deadlocked trying to quit", threadID); 202 203 clearPthreadHandleForIdentifier(threadID); 156 204 return joinResult; 157 205 } … … 159 207 void detachThread(ThreadIdentifier threadID) 160 208 { 161 ASSERT(threadID .isValid());162 163 pthread_t pthreadHandle = threadID.platformId();164 209 ASSERT(threadID); 210 211 pthread_t pthreadHandle = pthreadHandleForIdentifier(threadID); 212 165 213 pthread_detach(pthreadHandle); 214 215 clearPthreadHandleForIdentifier(threadID); 166 216 } 167 217 168 218 ThreadIdentifier currentThread() 169 219 { 170 return ThreadIdentifier(pthread_self()); 220 pthread_t currentThread = pthread_self(); 221 if (ThreadIdentifier id = identifierByPthreadHandle(currentThread)) 222 return id; 223 return establishIdentifierForPthreadHandle(currentThread); 171 224 } 172 225 … … 195 248 ASSERT_UNUSED(result, !result); 196 249 } 197 250 198 251 bool Mutex::tryLock() 199 252 { 200 253 int result = pthread_mutex_trylock(&m_mutex); 201 254 202 255 if (result == 0) 203 256 return true; … … 263 316 } 264 317 265 #if PLATFORM(DARWIN)266 // Derecated function. Safari 4 beta, until recompiled next time, uses ThreadIdentifier as uint32_t.267 // pthread_t is a pointer. So they get a pointer casted into uint32_t from CurrentThread()268 // and then pass it here. We cast it back to pointer. This is an ugly hack which is very temporary269 // and will be removed once next public build of Safari 4 is released.270 // Some versions of GCC require a prototype before a function with external linkage, so we have to271 // add a declaration here before defining the function.272 int waitForThreadCompletion(uint32_t, void**);273 int waitForThreadCompletion(uint32_t threadID, void** result)274 {275 pthread_t pthreadHandle = reinterpret_cast<pthread_t>(threadID);276 277 int joinResult = pthread_join(pthreadHandle, result);278 if (joinResult == EDEADLK)279 LOG_ERROR("ThreadIdentifier %p was found to be deadlocked trying to quit", pthreadHandle);280 281 return joinResult;282 }283 #endif284 285 318 } // namespace WTF 286 319 -
trunk/JavaScriptCore/wtf/ThreadingWin.cpp
r43507 r43663 99 99 namespace WTF { 100 100 101 bool ThreadIdentifier::operator==(const ThreadIdentifier& another) const102 {103 return m_platformId == another.m_platformId;104 }105 106 bool ThreadIdentifier::operator!=(const ThreadIdentifier& another) const107 {108 return m_platformId != another.m_platformId;109 }110 111 101 // MS_VC_EXCEPTION, THREADNAME_INFO, and setThreadNameInternal all come from <http://msdn.microsoft.com/en-us/library/xcb2z8hs.aspx>. 112 102 static const DWORD MS_VC_EXCEPTION = 0x406D1388; … … 150 140 static ThreadIdentifier mainThreadIdentifier; 151 141 142 static Mutex& threadMapMutex() 143 { 144 static Mutex mutex; 145 return mutex; 146 } 147 152 148 void initializeThreading() 153 149 { 154 150 if (!atomicallyInitializedStaticMutex) { 155 151 atomicallyInitializedStaticMutex = new Mutex; 152 threadMapMutex(); 156 153 initializeRandomNumberGenerator(); 157 154 initializeMainThread(); … … 161 158 } 162 159 160 static HashMap<DWORD, HANDLE>& threadMap() 161 { 162 static HashMap<DWORD, HANDLE> map; 163 return map; 164 } 165 166 static void storeThreadHandleByIdentifier(DWORD threadID, HANDLE threadHandle) 167 { 168 MutexLocker locker(threadMapMutex()); 169 ASSERT(!threadMap().contains(threadID)); 170 threadMap().add(threadID, threadHandle); 171 } 172 173 static HANDLE threadHandleForIdentifier(ThreadIdentifier id) 174 { 175 MutexLocker locker(threadMapMutex()); 176 return threadMap().get(id); 177 } 178 179 static void clearThreadHandleForIdentifier(ThreadIdentifier id) 180 { 181 MutexLocker locker(threadMapMutex()); 182 ASSERT(threadMap().contains(id)); 183 threadMap().remove(id); 184 } 185 163 186 struct ThreadFunctionInvocation { 164 187 ThreadFunctionInvocation(ThreadFunction function, void* data) : function(function), data(data) {} … … 186 209 { 187 210 unsigned threadIdentifier = 0; 211 ThreadIdentifier threadID = 0; 188 212 ThreadFunctionInvocation* invocation = new ThreadFunctionInvocation(entryPoint, data); 189 213 HANDLE threadHandle = reinterpret_cast<HANDLE>(_beginthreadex(0, 0, wtfThreadEntryPoint, invocation, 0, &threadIdentifier)); 190 214 if (!threadHandle) { 191 215 LOG_ERROR("Failed to create thread at entry point %p with data %p: %ld", entryPoint, data, errno); 192 return ThreadIdentifier(); 193 } 194 // Closes handle only, since we don't need it. The new thread runs until it exits. 195 CloseHandle(threadHandle); 196 197 return ThreadIdentifier(threadIdentifier); 216 return 0; 217 } 218 219 threadID = static_cast<ThreadIdentifier>(threadIdentifier); 220 storeThreadHandleByIdentifier(threadIdentifier, threadHandle); 221 222 return threadID; 198 223 } 199 224 200 225 int waitForThreadCompletion(ThreadIdentifier threadID, void** result) 201 226 { 202 ASSERT(threadID .isValid());227 ASSERT(threadID); 203 228 204 unsigned threadIdentifier = threadID.platformId(); 205 HANDLE threadHandle = OpenThread(SYNCHRONIZE, FALSE, threadIdentifier); 206 // If thread already exited, return immediately. 229 HANDLE threadHandle = threadHandleForIdentifier(threadID); 207 230 if (!threadHandle) 208 return WAIT_OBJECT_0;231 LOG_ERROR("ThreadIdentifier %u did not correspond to an active thread when trying to quit", threadID); 209 232 210 233 DWORD joinResult = WaitForSingleObject(threadHandle, INFINITE); 211 234 if (joinResult == WAIT_FAILED) 212 LOG_ERROR("ThreadIdentifier % p was found to be deadlocked trying to quit", threadHandle);235 LOG_ERROR("ThreadIdentifier %u was found to be deadlocked trying to quit", threadID); 213 236 214 237 CloseHandle(threadHandle); 238 clearThreadHandleForIdentifier(threadID); 215 239 216 240 return joinResult; 217 241 } 218 242 219 void detachThread(ThreadIdentifier) 220 { 243 void detachThread(ThreadIdentifier threadID) 244 { 245 ASSERT(threadID); 246 247 HANDLE threadHandle = threadHandleForIdentifier(threadID); 248 if (threadHandle) 249 CloseHandle(threadHandle); 250 clearThreadHandleForIdentifier(threadID); 221 251 } 222 252 223 253 ThreadIdentifier currentThread() 224 254 { 225 return ThreadIdentifier(GetCurrentThreadId());255 return static_cast<ThreadIdentifier>(GetCurrentThreadId()); 226 256 } 227 257 … … 441 471 } 442 472 443 // Deprecated functions. The current build of Safari 4 beta is linked with them so we need to provide444 // the implementation taking PlatformThreadIdentifier instead of ThreadIdentifier. These are not declared445 // in .h file so the next time Safari is built it will 'automatically' switch to new functions.446 // Then deprecated ones can be removed from this file and from JavaScriptCore.def and WebKit.def files.447 // In WebKit.def file, these functions are 'renamed' so their name does not have 'Deprecated' part - this448 // is to avoid having 2 functions with only different type of return value.449 void detachThreadDeprecated(PlatformThreadIdentifier)450 {451 }452 453 int waitForThreadCompletionDeprecated(PlatformThreadIdentifier threadID, void** result)454 {455 ASSERT(threadID);456 457 unsigned threadIdentifier = static_cast<unsigned>(threadID);458 HANDLE threadHandle = OpenThread(SYNCHRONIZE, FALSE, threadIdentifier);459 // If thread already exited, return immediately.460 if (!threadHandle)461 return WAIT_OBJECT_0;462 463 DWORD joinResult = WaitForSingleObject(threadHandle, INFINITE);464 if (joinResult == WAIT_FAILED)465 LOG_ERROR("ThreadIdentifier %p was found to be deadlocked trying to quit", threadHandle);466 467 CloseHandle(threadHandle);468 469 return joinResult;470 }471 472 PlatformThreadIdentifier currentThreadDeprecated()473 {474 return static_cast<PlatformThreadIdentifier>(GetCurrentThreadId());475 }476 477 PlatformThreadIdentifier createThreadDeprecated(ThreadFunction entryPoint, void* data, const char* name)478 {479 ThreadIdentifier threadID = createThread(entryPoint, data, name);480 return static_cast<PlatformThreadIdentifier>(threadID.platformId());481 }482 483 473 } // namespace WTF -
trunk/JavaScriptCore/wtf/gtk/ThreadingGtk.cpp
r43507 r43663 43 43 namespace WTF { 44 44 45 bool ThreadIdentifier::operator==(const ThreadIdentifier& another) const46 {47 return m_platformId == another.m_platformId;48 }49 50 bool ThreadIdentifier::operator!=(const ThreadIdentifier& another) const51 {52 return m_platformId != another.m_platformId;53 }54 55 45 static Mutex* atomicallyInitializedStaticMutex; 56 46 57 47 static ThreadIdentifier mainThreadIdentifier; 48 49 static Mutex& threadMapMutex() 50 { 51 static Mutex mutex; 52 return mutex; 53 } 58 54 59 55 void initializeThreading() … … 65 61 if (!atomicallyInitializedStaticMutex) { 66 62 atomicallyInitializedStaticMutex = new Mutex; 63 threadMapMutex(); 67 64 initializeRandomNumberGenerator(); 68 65 mainThreadIdentifier = currentThread(); … … 82 79 } 83 80 81 static HashMap<ThreadIdentifier, GThread*>& threadMap() 82 { 83 static HashMap<ThreadIdentifier, GThread*> map; 84 return map; 85 } 86 87 static ThreadIdentifier identifierByGthreadHandle(GThread*& thread) 88 { 89 MutexLocker locker(threadMapMutex()); 90 91 HashMap<ThreadIdentifier, GThread*>::iterator i = threadMap().begin(); 92 for (; i != threadMap().end(); ++i) { 93 if (i->second == thread) 94 return i->first; 95 } 96 97 return 0; 98 } 99 100 static ThreadIdentifier establishIdentifierForThread(GThread*& thread) 101 { 102 ASSERT(!identifierByGthreadHandle(thread)); 103 104 MutexLocker locker(threadMapMutex()); 105 106 static ThreadIdentifier identifierCount = 1; 107 108 threadMap().add(identifierCount, thread); 109 110 return identifierCount++; 111 } 112 113 static GThread* threadForIdentifier(ThreadIdentifier id) 114 { 115 MutexLocker locker(threadMapMutex()); 116 117 return threadMap().get(id); 118 } 119 120 static void clearThreadForIdentifier(ThreadIdentifier id) 121 { 122 MutexLocker locker(threadMapMutex()); 123 124 ASSERT(threadMap().contains(id)); 125 126 threadMap().remove(id); 127 } 128 84 129 ThreadIdentifier createThreadInternal(ThreadFunction entryPoint, void* data, const char*) 85 130 { … … 87 132 if (!(thread = g_thread_create(entryPoint, data, TRUE, 0))) { 88 133 LOG_ERROR("Failed to create thread at entry point %p with data %p", entryPoint, data); 89 return ThreadIdentifier(); 90 } 91 92 return ThreadIdentifier(thread); 134 return 0; 135 } 136 137 ThreadIdentifier threadID = establishIdentifierForThread(thread); 138 return threadID; 93 139 } 94 140 … … 99 145 int waitForThreadCompletion(ThreadIdentifier threadID, void** result) 100 146 { 101 ASSERT(threadID .isValid());102 103 GThread* thread = thread ID.platformId();147 ASSERT(threadID); 148 149 GThread* thread = threadForIdentifier(threadID); 104 150 105 151 void* joinResult = g_thread_join(thread); … … 107 153 *result = joinResult; 108 154 155 clearThreadForIdentifier(threadID); 109 156 return 0; 110 157 } … … 116 163 ThreadIdentifier currentThread() 117 164 { 118 return ThreadIdentifier(g_thread_self()); 165 GThread* currentThread = g_thread_self(); 166 if (ThreadIdentifier id = identifierByGthreadHandle(currentThread)) 167 return id; 168 return establishIdentifierForThread(currentThread); 119 169 } 120 170 -
trunk/JavaScriptCore/wtf/qt/ThreadingQt.cpp
r43637 r43663 42 42 namespace WTF { 43 43 44 bool ThreadIdentifier::operator==(const ThreadIdentifier& another) const45 {46 return m_platformId == another.m_platformId;47 }48 49 bool ThreadIdentifier::operator!=(const ThreadIdentifier& another) const50 {51 return m_platformId != another.m_platformId;52 }53 54 44 class ThreadPrivate : public QThread { 55 45 public: … … 80 70 static ThreadIdentifier mainThreadIdentifier; 81 71 72 static Mutex& threadMapMutex() 73 { 74 static Mutex mutex; 75 return mutex; 76 } 77 78 static HashMap<ThreadIdentifier, QThread*>& threadMap() 79 { 80 static HashMap<ThreadIdentifier, QThread*> map; 81 return map; 82 } 83 84 static ThreadIdentifier identifierByQthreadHandle(QThread*& thread) 85 { 86 MutexLocker locker(threadMapMutex()); 87 88 HashMap<ThreadIdentifier, QThread*>::iterator i = threadMap().begin(); 89 for (; i != threadMap().end(); ++i) { 90 if (i->second == thread) 91 return i->first; 92 } 93 94 return 0; 95 } 96 97 static ThreadIdentifier establishIdentifierForThread(QThread*& thread) 98 { 99 ASSERT(!identifierByQthreadHandle(thread)); 100 101 MutexLocker locker(threadMapMutex()); 102 103 static ThreadIdentifier identifierCount = 1; 104 105 threadMap().add(identifierCount, thread); 106 107 return identifierCount++; 108 } 109 110 static void clearThreadForIdentifier(ThreadIdentifier id) 111 { 112 MutexLocker locker(threadMapMutex()); 113 114 ASSERT(threadMap().contains(id)); 115 116 threadMap().remove(id); 117 } 118 119 static QThread* threadForIdentifier(ThreadIdentifier id) 120 { 121 MutexLocker locker(threadMapMutex()); 122 123 return threadMap().get(id); 124 } 125 82 126 void initializeThreading() 83 127 { 84 128 if (!atomicallyInitializedStaticMutex) { 85 129 atomicallyInitializedStaticMutex = new Mutex; 130 threadMapMutex(); 86 131 initializeRandomNumberGenerator(); 87 mainThreadIdentifier = ThreadIdentifier(QCoreApplication::instance()->thread()); 132 QThread* mainThread = QCoreApplication::instance()->thread(); 133 mainThreadIdentifier = identifierByQthreadHandle(mainThread); 134 if (!mainThreadIdentifier) 135 mainThreadIdentifier = establishIdentifierForThread(mainThread); 88 136 initializeMainThread(); 89 137 } … … 106 154 if (!thread) { 107 155 LOG_ERROR("Failed to create thread at entry point %p with data %p", entryPoint, data); 108 return ThreadIdentifier();156 return 0; 109 157 } 110 158 thread->start(); … … 112 160 QThread* threadRef = static_cast<QThread*>(thread); 113 161 114 return ThreadIdentifier(threadRef);162 return establishIdentifierForThread(threadRef); 115 163 } 116 164 … … 121 169 int waitForThreadCompletion(ThreadIdentifier threadID, void** result) 122 170 { 123 ASSERT(threadID .isValid());124 125 QThread* thread = thread ID.platformId();171 ASSERT(threadID); 172 173 QThread* thread = threadForIdentifier(threadID); 126 174 127 175 bool res = thread->wait(); 128 176 177 clearThreadForIdentifier(threadID); 129 178 if (result) 130 179 *result = static_cast<ThreadPrivate*>(thread)->getReturnValue(); … … 139 188 ThreadIdentifier currentThread() 140 189 { 141 return ThreadIdentifier(QThread::currentThread()); 190 QThread* currentThread = QThread::currentThread(); 191 if (ThreadIdentifier id = identifierByQthreadHandle(currentThread)) 192 return id; 193 return establishIdentifierForThread(currentThread); 142 194 } 143 195 -
trunk/WebCore/ChangeLog
r43662 r43663 1 2009-05-13 Dmitry Titov <dimich@chromium.org> 2 3 Rubber-stamped by Mark Rowe. 4 5 https://bugs.webkit.org/show_bug.cgi?id=25746 6 Revert http://trac.webkit.org/changeset/43507 which caused crash in PPC nightlies with Safari 4. 7 8 * dom/XMLTokenizerLibxml2.cpp: 9 (WebCore::matchFunc): 10 (WebCore::openFunc): 11 (WebCore::createStringParser): 12 (WebCore::createMemoryParser): 13 * loader/icon/IconDatabase.cpp: 14 (WebCore::IconDatabase::open): 15 * platform/sql/SQLiteDatabase.cpp: 16 (WebCore::SQLiteDatabase::SQLiteDatabase): 17 (WebCore::SQLiteDatabase::close): 18 * storage/DatabaseThread.cpp: 19 (WebCore::DatabaseThread::DatabaseThread): 20 (WebCore::DatabaseThread::start): 21 (WebCore::DatabaseThread::databaseThread): 22 * storage/LocalStorageThread.cpp: 23 (WebCore::LocalStorageThread::LocalStorageThread): 24 (WebCore::LocalStorageThread::start): 25 (WebCore::LocalStorageThread::localStorageThread): 26 (WebCore::LocalStorageThread::scheduleImport): 27 (WebCore::LocalStorageThread::scheduleSync): 28 (WebCore::LocalStorageThread::terminate): 29 * workers/WorkerThread.cpp: 30 (WebCore::WorkerThread::WorkerThread): 31 (WebCore::WorkerThread::start): 32 1 33 2009-05-13 David Hyatt <hyatt@apple.com> 2 34 -
trunk/WebCore/dom/XMLTokenizerLibxml2.cpp
r43507 r43663 327 327 328 328 static int globalDescriptor = 0; 329 330 static ThreadIdentifier& libxmlLoaderThread() { 331 DEFINE_STATIC_LOCAL(ThreadIdentifier, staticLibxmlLoaderThread, ()); 332 return staticLibxmlLoaderThread; 333 } 329 static ThreadIdentifier libxmlLoaderThread = 0; 334 330 335 331 static int matchFunc(const char*) … … 337 333 // Only match loads initiated due to uses of libxml2 from within XMLTokenizer to avoid 338 334 // interfering with client applications that also use libxml2. http://bugs.webkit.org/show_bug.cgi?id=17353 339 return XMLTokenizerScope::currentDocLoader && currentThread() == libxmlLoaderThread ();335 return XMLTokenizerScope::currentDocLoader && currentThread() == libxmlLoaderThread; 340 336 } 341 337 … … 398 394 { 399 395 ASSERT(XMLTokenizerScope::currentDocLoader); 400 ASSERT(currentThread() == libxmlLoaderThread ());396 ASSERT(currentThread() == libxmlLoaderThread); 401 397 402 398 KURL url(KURL(), uri); … … 467 463 xmlRegisterInputCallbacks(matchFunc, openFunc, readFunc, closeFunc); 468 464 xmlRegisterOutputCallbacks(matchFunc, openFunc, writeFunc, closeFunc); 469 libxmlLoaderThread ()= currentThread();465 libxmlLoaderThread = currentThread(); 470 466 didInit = true; 471 467 } … … 489 485 xmlRegisterInputCallbacks(matchFunc, openFunc, readFunc, closeFunc); 490 486 xmlRegisterOutputCallbacks(matchFunc, openFunc, writeFunc, closeFunc); 491 libxmlLoaderThread ()= currentThread();487 libxmlLoaderThread = currentThread(); 492 488 didInit = true; 493 489 } -
trunk/WebCore/loader/icon/IconDatabase.cpp
r43507 r43663 136 136 m_syncLock.lock(); 137 137 m_syncThread = createThread(IconDatabase::iconDatabaseSyncThreadStart, this, "WebCore: IconDatabase"); 138 m_syncThreadRunning = m_syncThread .isValid();138 m_syncThreadRunning = m_syncThread; 139 139 m_syncLock.unlock(); 140 141 return m_syncThreadRunning; 140 if (!m_syncThread) 141 return false; 142 return true; 142 143 } 143 144 -
trunk/WebCore/platform/sql/SQLiteDatabase.cpp
r43507 r43663 48 48 , m_pageSize(-1) 49 49 , m_transactionInProgress(false) 50 , m_openingThread(0) 50 51 { 51 52 } … … 89 90 } 90 91 91 m_openingThread .invalidate();92 m_openingThread = 0; 92 93 } 93 94 -
trunk/WebCore/storage/DatabaseThread.cpp
r43507 r43663 40 40 41 41 DatabaseThread::DatabaseThread() 42 : m_threadID(0) 42 43 { 43 44 m_selfRef = this; … … 53 54 MutexLocker lock(m_threadCreationMutex); 54 55 55 if (m_threadID .isValid())56 if (m_threadID) 56 57 return true; 57 58 58 59 m_threadID = createThread(DatabaseThread::databaseThreadStart, this, "WebCore: Database"); 59 60 60 return m_threadID .isValid();61 return m_threadID; 61 62 } 62 63 … … 97 98 } 98 99 99 LOG(StorageAPI, "About to detach thread and clear the ref to DatabaseThread %p, which currently has %i ref(s)", this, refCount());100 LOG(StorageAPI, "About to detach thread %i and clear the ref to DatabaseThread %p, which currently has %i ref(s)", m_threadID, this, refCount()); 100 101 101 102 // Detach the thread so its resources are no longer of any concern to anyone else -
trunk/WebCore/storage/LocalStorageThread.cpp
r43507 r43663 39 39 40 40 LocalStorageThread::LocalStorageThread() 41 : m_threadID(0) 41 42 { 42 43 m_selfRef = this; … … 47 48 MutexLocker lock(m_threadCreationMutex); 48 49 49 if ( !m_threadID.isValid())50 m_threadID = createThread(LocalStorageThread::localStorageThreadStart, this, "WebCore: LocalStorage");50 if (m_threadID) 51 return true; 51 52 52 return m_threadID.isValid(); 53 m_threadID = createThread(LocalStorageThread::localStorageThreadStart, this, "WebCore: LocalStorage"); 54 55 return m_threadID; 53 56 } 54 57 … … 75 78 // Detach the thread so its resources are no longer of any concern to anyone else 76 79 detachThread(m_threadID); 77 m_threadID .invalidate();80 m_threadID = 0; 78 81 79 82 // Clear the self refptr, possibly resulting in deletion … … 85 88 void LocalStorageThread::scheduleImport(PassRefPtr<LocalStorage> storage) 86 89 { 87 ASSERT(!m_queue.killed() && m_threadID .isValid());90 ASSERT(!m_queue.killed() && m_threadID); 88 91 m_queue.append(LocalStorageTask::createImport(storage)); 89 92 } … … 91 94 void LocalStorageThread::scheduleSync(PassRefPtr<LocalStorage> storage) 92 95 { 93 ASSERT(!m_queue.killed() && m_threadID .isValid());96 ASSERT(!m_queue.killed() && m_threadID); 94 97 m_queue.append(LocalStorageTask::createSync(storage)); 95 98 } … … 97 100 void LocalStorageThread::scheduleImport(PassRefPtr<LocalStorageArea> area) 98 101 { 99 ASSERT(!m_queue.killed() && m_threadID .isValid());102 ASSERT(!m_queue.killed() && m_threadID); 100 103 m_queue.append(LocalStorageTask::createImport(area)); 101 104 } … … 103 106 void LocalStorageThread::scheduleSync(PassRefPtr<LocalStorageArea> area) 104 107 { 105 ASSERT(!m_queue.killed() && m_threadID .isValid());108 ASSERT(!m_queue.killed() && m_threadID); 106 109 m_queue.append(LocalStorageTask::createSync(area)); 107 110 } … … 113 116 // Ideally we'd never be killing a thread that wasn't live, so ASSERT it. 114 117 // But if we do in a release build, make sure to not wait on a condition that will never get signalled 115 ASSERT(!m_queue.killed() && m_threadID .isValid());116 if (!m_threadID .isValid())118 ASSERT(!m_queue.killed() && m_threadID); 119 if (!m_threadID) 117 120 return; 118 121 -
trunk/WebCore/workers/WorkerThread.cpp
r43507 r43663 69 69 70 70 WorkerThread::WorkerThread(const KURL& scriptURL, const String& userAgent, const String& sourceCode, WorkerObjectProxy* workerObjectProxy) 71 : m_workerObjectProxy(workerObjectProxy) 71 : m_threadID(0) 72 , m_workerObjectProxy(workerObjectProxy) 72 73 , m_startupData(WorkerThreadStartupData::create(scriptURL, userAgent, sourceCode)) 73 74 { … … 83 84 MutexLocker lock(m_threadCreationMutex); 84 85 85 if ( !m_threadID.isValid())86 m_threadID = createThread(WorkerThread::workerThreadStart, this, "WebCore: Worker");86 if (m_threadID) 87 return true; 87 88 88 return m_threadID.isValid(); 89 m_threadID = createThread(WorkerThread::workerThreadStart, this, "WebCore: Worker"); 90 91 return m_threadID; 89 92 } 90 93 -
trunk/WebKit/win/ChangeLog
r43569 r43663 1 2009-05-13 Dmitry Titov <dimich@chromium.org> 2 3 Rubber-stamped by Mark Rowe. 4 5 https://bugs.webkit.org/show_bug.cgi?id=25746 6 Revert http://trac.webkit.org/changeset/43507 which caused crash in PPC nightlies with Safari 4. 7 8 * WebKit.vcproj/WebKit.def: 9 * WebKit.vcproj/WebKit_debug.def: 10 1 11 2009-05-12 Steve Falkenburg <sfalken@apple.com> 2 12 -
trunk/WebKit/win/WebKit.vcproj/WebKit.def
r43507 r43663 115 115 ??1Mutex@WTF@@QAE@XZ 116 116 ??1ThreadCondition@WTF@@QAE@XZ 117 ??8ThreadIdentifier@WTF@@QBE_NABV01@@Z118 117 ?broadcast@ThreadCondition@WTF@@QAEXXZ 119 118 ?callOnMainThread@WTF@@YAXP6AXPAX@Z0@Z 120 ?createThread@WTF@@YA ?AVThreadIdentifier@1@P6APAXPAX@Z0PBD@Z121 ?currentThread@WTF@@YA ?AVThreadIdentifier@1@XZ122 ?detachThread@WTF@@YAX VThreadIdentifier@1@@Z119 ?createThread@WTF@@YAIP6APAXPAX@Z0PBD@Z 120 ?currentThread@WTF@@YAIXZ 121 ?detachThread@WTF@@YAXI@Z 123 122 ?initializeMainThread@WTF@@YAXXZ 124 123 ?initializeThreading@WTF@@YAXXZ … … 134 133 ?unlockAtomicallyInitializedStaticMutex@WTF@@YAXXZ 135 134 ?wait@ThreadCondition@WTF@@QAEXAAVMutex@2@@Z 136 ?waitForThreadCompletion@WTF@@YAHVThreadIdentifier@1@PAPAX@Z 137 ?createThread@WTF@@YAIP6APAXPAX@Z0PBD@Z=?createThreadDeprecated@WTF@@YAIP6APAXPAX@Z0PBD@Z 138 ?currentThread@WTF@@YAIXZ=?currentThreadDeprecated@WTF@@YAIXZ 139 ?detachThread@WTF@@YAXI@Z=?detachThreadDeprecated@WTF@@YAXI@Z 140 ?waitForThreadCompletion@WTF@@YAHIPAPAX@Z=?waitForThreadCompletionDeprecated@WTF@@YAHIPAPAX@Z 135 ?waitForThreadCompletion@WTF@@YAHIPAPAX@Z 136 ?createThread@WTF@@YAIP6APAXPAX@Z0@Z -
trunk/WebKit/win/WebKit.vcproj/WebKit_debug.def
r43507 r43663 115 115 ??1Mutex@WTF@@QAE@XZ 116 116 ??1ThreadCondition@WTF@@QAE@XZ 117 ??8ThreadIdentifier@WTF@@QBE_NABV01@@Z118 117 ?broadcast@ThreadCondition@WTF@@QAEXXZ 119 118 ?callOnMainThread@WTF@@YAXP6AXPAX@Z0@Z 120 ?createThread@WTF@@YA ?AVThreadIdentifier@1@P6APAXPAX@Z0PBD@Z121 ?currentThread@WTF@@YA ?AVThreadIdentifier@1@XZ122 ?detachThread@WTF@@YAX VThreadIdentifier@1@@Z119 ?createThread@WTF@@YAIP6APAXPAX@Z0PBD@Z 120 ?currentThread@WTF@@YAIXZ 121 ?detachThread@WTF@@YAXI@Z 123 122 ?initializeMainThread@WTF@@YAXXZ 124 123 ?initializeThreading@WTF@@YAXXZ … … 134 133 ?unlockAtomicallyInitializedStaticMutex@WTF@@YAXXZ 135 134 ?wait@ThreadCondition@WTF@@QAEXAAVMutex@2@@Z 136 ?waitForThreadCompletion@WTF@@YAHVThreadIdentifier@1@PAPAX@Z 137 ?createThread@WTF@@YAIP6APAXPAX@Z0PBD@Z=?createThreadDeprecated@WTF@@YAIP6APAXPAX@Z0PBD@Z 138 ?currentThread@WTF@@YAIXZ=?currentThreadDeprecated@WTF@@YAIXZ 139 ?detachThread@WTF@@YAXI@Z=?detachThreadDeprecated@WTF@@YAXI@Z 140 ?waitForThreadCompletion@WTF@@YAHIPAPAX@Z=?waitForThreadCompletionDeprecated@WTF@@YAHIPAPAX@Z 135 ?waitForThreadCompletion@WTF@@YAHIPAPAX@Z 136 ?createThread@WTF@@YAIP6APAXPAX@Z0@Z
Note: See TracChangeset
for help on using the changeset viewer.