Changeset 43366 in webkit for trunk/JavaScriptCore/wtf
- Timestamp:
- May 7, 2009, 2:24:36 PM (16 years ago)
- Location:
- trunk/JavaScriptCore/wtf
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/wtf/CrossThreadRefCounted.h
r41536 r43366 75 75 : m_threadSafeRefCounter(threadedCounter) 76 76 , m_data(data) 77 #ifndef NDEBUG78 , m_threadId(0)79 #endif80 77 { 81 78 } … … 100 97 void CrossThreadRefCounted<T>::ref() 101 98 { 102 ASSERT(!m_threadId || m_threadId == currentThread());99 ASSERT(!m_threadId.isValid() || m_threadId == currentThread()); 103 100 m_refCounter.ref(); 104 101 #ifndef NDEBUG … … 108 105 // is a heuristic but it seems to always work and has helped 109 106 // find some bugs. 110 if (!m_threadId && m_refCounter.refCount() == 2)107 if (!m_threadId.isValid() && m_refCounter.refCount() == 2) 111 108 m_threadId = currentThread(); 112 109 #endif … … 116 113 void CrossThreadRefCounted<T>::deref() 117 114 { 118 ASSERT(!m_threadId || m_threadId == currentThread());115 ASSERT(!m_threadId.isValid() || m_threadId == currentThread()); 119 116 if (m_refCounter.derefBase()) { 120 117 threadSafeDeref(); … … 125 122 // is safe to be passed to another thread at this point. 126 123 if (m_threadId && m_refCounter.refCount() == 1) 127 m_threadId = 0;124 m_threadId.invalidate(); 128 125 #endif 129 126 } -
trunk/JavaScriptCore/wtf/Threading.h
r41605 r43366 86 86 typedef struct _GMutex GMutex; 87 87 typedef struct _GCond GCond; 88 typedef struct _GThread GThread; 88 89 #endif 89 90 … … 92 93 QT_BEGIN_NAMESPACE 93 94 class QMutex; 95 class QThread; 94 96 class QWaitCondition; 95 97 QT_END_NAMESPACE … … 106 108 namespace WTF { 107 109 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 127 110 #if USE(PTHREADS) 128 111 typedef pthread_mutex_t PlatformMutex; 129 112 typedef pthread_cond_t PlatformCondition; 113 typedef pthread_t PlatformThreadIdentifier; 130 114 #elif PLATFORM(GTK) 131 115 typedef GOwnPtr<GMutex> PlatformMutex; 132 116 typedef GOwnPtr<GCond> PlatformCondition; 117 typedef GThread* PlatformThreadIdentifier; 133 118 #elif PLATFORM(QT) 134 119 typedef QT_PREPEND_NAMESPACE(QMutex)* PlatformMutex; 135 120 typedef QT_PREPEND_NAMESPACE(QWaitCondition)* PlatformCondition; 121 typedef QT_PREPEND_NAMESPACE(QThread)* PlatformThreadIdentifier; 136 122 #elif PLATFORM(WIN_OS) 137 123 struct PlatformMutex { … … 150 136 void signal(bool unblockAll); 151 137 }; 138 typedef unsigned PlatformThreadIdentifier; 152 139 #else 153 140 typedef void* PlatformMutex; … … 155 142 #endif 156 143 144 // Platform-independent wrapper for thread id. Assignable and copyable. 145 // The only way to obtain a valid ThreadIdentifier is from createThread(...) or currentThread() functions. 146 // ThreadIdentifier remains valid for as long as its thread is alive and is not automatically invalidated 147 // when thread terminates. Since platform-dependent thread ids can be recycled, stale ThreadIdentifier 148 // 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 157 193 class Mutex : Noncopyable { 158 194 public: -
trunk/JavaScriptCore/wtf/ThreadingNone.cpp
r41605 r43366 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 35 38 void initializeThreading() { } 36 39 ThreadIdentifier createThreadInternal(ThreadFunction, void*, const char*) { return 0; } -
trunk/JavaScriptCore/wtf/ThreadingPthreads.cpp
r42366 r43366 49 49 namespace WTF { 50 50 51 typedef HashMap<ThreadIdentifier, pthread_t> ThreadMap; 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 } 52 60 53 61 static Mutex* atomicallyInitializedStaticMutex; … … 57 65 #endif 58 66 59 static Mutex& threadMapMutex()60 {61 DEFINE_STATIC_LOCAL(Mutex, mutex, ());62 return mutex;63 }64 65 67 void initializeThreading() 66 68 { 67 69 if (!atomicallyInitializedStaticMutex) { 68 70 atomicallyInitializedStaticMutex = new Mutex; 69 threadMapMutex();70 71 initializeRandomNumberGenerator(); 71 72 #if !PLATFORM(DARWIN) || PLATFORM(CHROMIUM) … … 85 86 { 86 87 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);135 88 } 136 89 … … 165 118 if (pthread_create(&threadHandle, 0, runThreadWithRegistration, static_cast<void*>(threadData))) { 166 119 LOG_ERROR("Failed to create pthread at entry point %p with data %p", entryPoint, data); 167 return 0;168 } 169 return establishIdentifierForPthreadHandle(threadHandle);120 return ThreadIdentifier(); 121 } 122 return ThreadIdentifier(threadHandle); 170 123 } 171 124 #else … … 175 128 if (pthread_create(&threadHandle, 0, entryPoint, data)) { 176 129 LOG_ERROR("Failed to create pthread at entry point %p with data %p", entryPoint, data); 177 return 0;178 } 179 180 return establishIdentifierForPthreadHandle(threadHandle);130 return ThreadIdentifier(); 131 } 132 133 return ThreadIdentifier(threadHandle); 181 134 } 182 135 #endif … … 193 146 int waitForThreadCompletion(ThreadIdentifier threadID, void** result) 194 147 { 195 ASSERT(threadID );196 197 pthread_t pthreadHandle = pthreadHandleForIdentifier(threadID);148 ASSERT(threadID.isValid()); 149 150 pthread_t pthreadHandle = threadID.platformId(); 198 151 199 152 int joinResult = pthread_join(pthreadHandle, result); 200 153 if (joinResult == EDEADLK) 201 LOG_ERROR("ThreadIdentifier % u was found to be deadlocked trying to quit", threadID);154 LOG_ERROR("ThreadIdentifier %p was found to be deadlocked trying to quit", pthreadHandle); 202 155 203 clearPthreadHandleForIdentifier(threadID);204 156 return joinResult; 205 157 } … … 207 159 void detachThread(ThreadIdentifier threadID) 208 160 { 209 ASSERT(threadID );210 211 pthread_t pthreadHandle = pthreadHandleForIdentifier(threadID);161 ASSERT(threadID.isValid()); 162 163 pthread_t pthreadHandle = threadID.platformId(); 212 164 213 165 pthread_detach(pthreadHandle); 214 215 clearPthreadHandleForIdentifier(threadID);216 166 } 217 167 218 168 ThreadIdentifier currentThread() 219 169 { 220 pthread_t currentThread = pthread_self(); 221 if (ThreadIdentifier id = identifierByPthreadHandle(currentThread)) 222 return id; 223 return establishIdentifierForPthreadHandle(currentThread); 170 return ThreadIdentifier(pthread_self()); 224 171 } 225 172 -
trunk/JavaScriptCore/wtf/ThreadingWin.cpp
r41626 r43366 99 99 namespace WTF { 100 100 101 bool ThreadIdentifier::operator==(const ThreadIdentifier& another) const 102 { 103 return m_platformId == another.m_platformId; 104 } 105 106 bool ThreadIdentifier::operator!=(const ThreadIdentifier& another) const 107 { 108 return m_platformId != another.m_platformId; 109 } 110 101 111 // MS_VC_EXCEPTION, THREADNAME_INFO, and setThreadNameInternal all come from <http://msdn.microsoft.com/en-us/library/xcb2z8hs.aspx>. 102 112 static const DWORD MS_VC_EXCEPTION = 0x406D1388; … … 140 150 static ThreadIdentifier mainThreadIdentifier; 141 151 142 static Mutex& threadMapMutex()143 {144 static Mutex mutex;145 return mutex;146 }147 148 152 void initializeThreading() 149 153 { 150 154 if (!atomicallyInitializedStaticMutex) { 151 155 atomicallyInitializedStaticMutex = new Mutex; 152 threadMapMutex();153 156 initializeRandomNumberGenerator(); 154 157 initializeMainThread(); … … 158 161 } 159 162 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 186 163 struct ThreadFunctionInvocation { 187 164 ThreadFunctionInvocation(ThreadFunction function, void* data) : function(function), data(data) {} … … 209 186 { 210 187 unsigned threadIdentifier = 0; 211 ThreadIdentifier threadID = 0;212 188 ThreadFunctionInvocation* invocation = new ThreadFunctionInvocation(entryPoint, data); 213 189 HANDLE threadHandle = reinterpret_cast<HANDLE>(_beginthreadex(0, 0, wtfThreadEntryPoint, invocation, 0, &threadIdentifier)); 214 190 if (!threadHandle) { 215 191 LOG_ERROR("Failed to create thread at entry point %p with data %p: %ld", entryPoint, data, errno); 216 return 0; 217 } 218 219 threadID = static_cast<ThreadIdentifier>(threadIdentifier); 220 storeThreadHandleByIdentifier(threadIdentifier, threadHandle); 221 222 return threadID; 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); 223 198 } 224 199 225 200 int waitForThreadCompletion(ThreadIdentifier threadID, void** result) 226 201 { 227 ASSERT(threadID );202 ASSERT(threadID.isValid()); 228 203 229 HANDLE threadHandle = threadHandleForIdentifier(threadID); 204 unsigned threadIdentifier = threadID.platformId(); 205 HANDLE threadHandle = OpenThread(SYNCHRONIZE, FALSE, threadIdentifier); 206 // If thread already exited, return immediately. 230 207 if (!threadHandle) 231 LOG_ERROR("ThreadIdentifier %u did not correspond to an active thread when trying to quit", threadID);208 return WAIT_OBJECT_0; 232 209 233 210 DWORD joinResult = WaitForSingleObject(threadHandle, INFINITE); 234 211 if (joinResult == WAIT_FAILED) 235 LOG_ERROR("ThreadIdentifier % u was found to be deadlocked trying to quit", threadID);212 LOG_ERROR("ThreadIdentifier %p was found to be deadlocked trying to quit", threadHandle); 236 213 237 214 CloseHandle(threadHandle); 238 clearThreadHandleForIdentifier(threadID);239 215 240 216 return joinResult; 241 217 } 242 218 243 void detachThread(ThreadIdentifier threadID) 244 { 245 ASSERT(threadID); 246 247 HANDLE threadHandle = threadHandleForIdentifier(threadID); 248 if (threadHandle) 249 CloseHandle(threadHandle); 250 clearThreadHandleForIdentifier(threadID); 219 void detachThread(ThreadIdentifier) 220 { 251 221 } 252 222 253 223 ThreadIdentifier currentThread() 254 224 { 255 return static_cast<ThreadIdentifier>(GetCurrentThreadId());225 return ThreadIdentifier(GetCurrentThreadId()); 256 226 } 257 227 … … 471 441 } 472 442 443 // Deprecated functions. The current build of Safari 4 beta is linked with them so we need to provide 444 // the implementation taking PlatformThreadIdentifier instead of ThreadIdentifier. These are not declared 445 // 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 - this 448 // 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 473 483 } // namespace WTF -
trunk/JavaScriptCore/wtf/gtk/ThreadingGtk.cpp
r42857 r43366 43 43 namespace WTF { 44 44 45 bool ThreadIdentifier::operator==(const ThreadIdentifier& another) const 46 { 47 return m_platformId == another.m_platformId; 48 } 49 50 bool ThreadIdentifier::operator!=(const ThreadIdentifier& another) const 51 { 52 return m_platformId != another.m_platformId; 53 } 54 45 55 static Mutex* atomicallyInitializedStaticMutex; 46 56 47 57 static ThreadIdentifier mainThreadIdentifier; 48 49 static Mutex& threadMapMutex()50 {51 static Mutex mutex;52 return mutex;53 }54 58 55 59 void initializeThreading() … … 61 65 if (!atomicallyInitializedStaticMutex) { 62 66 atomicallyInitializedStaticMutex = new Mutex; 63 threadMapMutex();64 67 initializeRandomNumberGenerator(); 65 68 mainThreadIdentifier = currentThread(); … … 79 82 } 80 83 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 129 84 ThreadIdentifier createThreadInternal(ThreadFunction entryPoint, void* data, const char*) 130 85 { … … 132 87 if (!(thread = g_thread_create(entryPoint, data, TRUE, 0))) { 133 88 LOG_ERROR("Failed to create thread at entry point %p with data %p", entryPoint, data); 134 return 0;89 return ThreadIdentifier(); 135 90 } 136 91 137 ThreadIdentifier threadID = establishIdentifierForThread(thread); 138 return threadID; 92 return ThreadIdentifier(thread); 139 93 } 140 94 … … 145 99 int waitForThreadCompletion(ThreadIdentifier threadID, void** result) 146 100 { 147 ASSERT(threadID );101 ASSERT(threadID.isValid()); 148 102 149 GThread* thread = thread ForIdentifier(threadID);103 GThread* thread = threadID.platformId(); 150 104 151 105 void* joinResult = g_thread_join(thread); … … 153 107 *result = joinResult; 154 108 155 clearThreadForIdentifier(threadID);156 109 return 0; 157 110 } … … 163 116 ThreadIdentifier currentThread() 164 117 { 165 GThread* currentThread = g_thread_self(); 166 if (ThreadIdentifier id = identifierByGthreadHandle(currentThread)) 167 return id; 168 return establishIdentifierForThread(currentThread); 118 return ThreadIdentifier(g_thread_self()); 169 119 } 170 120 -
trunk/JavaScriptCore/wtf/qt/ThreadingQt.cpp
r42858 r43366 42 42 namespace WTF { 43 43 44 bool ThreadIdentifier::operator==(const ThreadIdentifier& another) const 45 { 46 return m_platformId == another.m_platformId; 47 } 48 49 bool ThreadIdentifier::operator!=(const ThreadIdentifier& another) const 50 { 51 return m_platformId != another.m_platformId; 52 } 53 44 54 class ThreadPrivate : public QThread { 45 55 public: … … 70 80 static ThreadIdentifier mainThreadIdentifier; 71 81 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 126 82 void initializeThreading() 127 83 { 128 84 if (!atomicallyInitializedStaticMutex) { 129 85 atomicallyInitializedStaticMutex = new Mutex; 130 threadMapMutex();131 86 initializeRandomNumberGenerator(); 132 QThread* mainThread = QCoreApplication::instance()->thread(); 133 mainThreadIdentifier = identifierByQthreadHandle(mainThread); 134 if (!mainThreadIdentifier) 135 mainThreadIdentifier = establishIdentifierForThread(mainThread); 87 mainThreadIdentifier = ThreadIdentifier(QCoreApplication::instance()->thread()); 136 88 initializeMainThread(); 137 89 } … … 154 106 if (!thread) { 155 107 LOG_ERROR("Failed to create thread at entry point %p with data %p", entryPoint, data); 156 return 0;108 return ThreadIdentifier(); 157 109 } 158 110 thread->start(); … … 160 112 QThread* threadRef = static_cast<QThread*>(thread); 161 113 162 return establishIdentifierForThread(threadRef);114 return ThreadIdentifier(threadRef); 163 115 } 164 116 … … 169 121 int waitForThreadCompletion(ThreadIdentifier threadID, void** result) 170 122 { 171 ASSERT(threadID );172 173 QThread* thread = thread ForIdentifier(threadID);123 ASSERT(threadID.IsValid()); 124 125 QThread* thread = threadID.platformId(); 174 126 175 127 bool res = thread->wait(); 176 128 177 clearThreadForIdentifier(threadID);178 129 if (result) 179 130 *result = static_cast<ThreadPrivate*>(thread)->getReturnValue(); … … 188 139 ThreadIdentifier currentThread() 189 140 { 190 QThread* currentThread = QThread::currentThread(); 191 if (ThreadIdentifier id = identifierByQthreadHandle(currentThread)) 192 return id; 193 return establishIdentifierForThread(currentThread); 141 return ThreadIdentifier(QThread::currentThread()); 194 142 } 195 143
Note:
See TracChangeset
for help on using the changeset viewer.