/* QThreadData */ QThreadData *QThreadData::current() { qt_create_tls(); QThreadData *threadData = reinterpret_cast<QThreadData *>(TlsGetValue(qt_current_thread_data_tls_index)); if (!threadData) { QThread *adopted = 0; if (QInternal::activateCallbacks(QInternal::AdoptCurrentThread, (void **) &adopted)) { Q_ASSERT(adopted); threadData = QThreadData::get2(adopted); TlsSetValue(qt_current_thread_data_tls_index, threadData); adopted->d_func()->running = true; adopted->d_func()->finished = false; static_cast<QAdoptedThread *>(adopted)->init(); } else { threadData = new QThreadData; // This needs to be called prior to new AdoptedThread() to // avoid recursion. TlsSetValue(qt_current_thread_data_tls_index, threadData); QT_TRY { threadData->thread = new QAdoptedThread(threadData); } QT_CATCH(...) { TlsSetValue(qt_current_thread_data_tls_index, 0); threadData->deref(); threadData = 0; QT_RETHROW; } threadData->deref(); }
/* QThreadData */ QThreadData *QThreadData::current() { qt_create_tls(); QThreadData *threadData = *qt_tls; if (!threadData) { QThread *adopted = 0; if (QInternal::activateCallbacks(QInternal::AdoptCurrentThread, (void **) &adopted)) { Q_ASSERT(adopted); threadData = QThreadData::get2(adopted); *qt_tls = threadData; adopted->d_func()->running = true; adopted->d_func()->finished = false; static_cast<QAdoptedThread *>(adopted)->init(); } else { threadData = new QThreadData; // This needs to be called prior to new AdoptedThread() to // avoid recursion. *qt_tls = threadData; threadData->thread = new QAdoptedThread(threadData); threadData->deref(); } if (!QCoreApplicationPrivate::theMainThread) { QCoreApplicationPrivate::theMainThread = threadData->thread; } else { PTIB ptib; DosGetInfoBlocks(&ptib, NULL); qt_watch_adopted_thread(ptib->tib_ptib2->tib2_ultid, threadData->thread); } } return threadData; }
void QThread::initialize() { if (qt_global_mutexpool) return; qt_global_mutexpool = QMutexPool::instance(); #if defined (Q_OS_WIN) qt_create_tls(); #endif }
QThreadData *QThreadData::current(bool createIfNecessary) { qt_create_tls(); QThreadData *threadData = reinterpret_cast<QThreadData *>(TlsGetValue(qt_current_thread_data_tls_index)); if (!threadData && createIfNecessary) { threadData = new QThreadData; // This needs to be called prior to new AdoptedThread() to // avoid recursion. TlsSetValue(qt_current_thread_data_tls_index, threadData); QT_TRY { threadData->thread = new QAdoptedThread(threadData); } QT_CATCH(...) { TlsSetValue(qt_current_thread_data_tls_index, 0); threadData->deref(); threadData = 0; QT_RETHROW; }
/* QThreadData */ QThreadData *QThreadData::current() { qt_create_tls(); QThreadData *threadData = reinterpret_cast<QThreadData *>(TlsGetValue(qt_current_thread_data_tls_index)); if (!threadData) { QThread *adopted = 0; if (QInternal::activateCallbacks(QInternal::AdoptCurrentThread, (void **) &adopted)) { Q_ASSERT(adopted); threadData = QThreadData::get2(adopted); TlsSetValue(qt_current_thread_data_tls_index, threadData); adopted->d_func()->running = true; adopted->d_func()->finished = false; static_cast<QAdoptedThread *>(adopted)->init(); } else { threadData = new QThreadData; // This needs to be called prior to new AdoptedThread() to // avoid recursion. TlsSetValue(qt_current_thread_data_tls_index, threadData); threadData->thread = new QAdoptedThread(threadData); threadData->deref(); } if (!QCoreApplicationPrivate::theMainThread) { QCoreApplicationPrivate::theMainThread = threadData->thread; } else { HANDLE realHandle = INVALID_HANDLE_VALUE; #if !defined(Q_OS_WINCE) || (defined(_WIN32_WCE) && (_WIN32_WCE>=0x600)) DuplicateHandle(GetCurrentProcess(), GetCurrentThread(), GetCurrentProcess(), &realHandle, 0, FALSE, DUPLICATE_SAME_ACCESS); #else realHandle = (HANDLE)GetCurrentThreadId(); #endif qt_watch_adopted_thread(realHandle, threadData->thread); } } return threadData; }
/* QThreadData */ QThreadData *QThreadData::current() { qt_create_tls(); QThreadData *threadData = reinterpret_cast<QThreadData *>(TlsGetValue(qt_current_thread_data_tls_index)); if (!threadData) { QThread *adopted = 0; if (QInternal::activateCallbacks(QInternal::AdoptCurrentThread, (void **) &adopted)) { Q_ASSERT(adopted); threadData = QThreadData::get2(adopted); TlsSetValue(qt_current_thread_data_tls_index, threadData); adopted->d_func()->running = true; adopted->d_func()->finished = false; static_cast<QAdoptedThread *>(adopted)->init(); } else { threadData = new QThreadData; // This needs to be called prior to new AdoptedThread() to // avoid recursion. TlsSetValue(qt_current_thread_data_tls_index, threadData); threadData->thread = new QAdoptedThread(threadData); threadData->deref(); } const bool isMainThread = q_atomic_test_and_set_ptr(&QCoreApplicationPrivate::theMainThread, 0, threadData->thread); if (!isMainThread) { HANDLE realHandle; DuplicateHandle(GetCurrentProcess(), GetCurrentThread(), GetCurrentProcess(), &realHandle, 0, FALSE, DUPLICATE_SAME_ACCESS); qt_watch_adopted_thread(realHandle, threadData->thread); } } return threadData; }