Changeset 43392 in webkit for trunk/JavaScriptCore/wtf
- Timestamp:
- May 7, 2009, 11:47:19 PM (16 years ago)
- Location:
- trunk/JavaScriptCore/wtf
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/wtf/CrossThreadRefCounted.h
r43366 r43392 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
r43366 r43392 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 // 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 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
r43369 r43392 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
r43366 r43392 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();195 ASSERT(threadID); 196 197 pthread_t pthreadHandle = pthreadHandleForIdentifier(threadID); 151 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);201 LOG_ERROR("ThreadIdentifier %u was found to be deadlocked trying to quit", threadID); 155 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();209 ASSERT(threadID); 210 211 pthread_t pthreadHandle = pthreadHandleForIdentifier(threadID); 164 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 -
trunk/JavaScriptCore/wtf/ThreadingWin.cpp
r43366 r43392 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
r43366 r43392 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
r43366 r43392 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
Note:
See TracChangeset
for help on using the changeset viewer.