QThreadData *QThreadData::current() { pthread_once(¤t_thread_data_once, create_current_thread_data_key); QThreadData *data = reinterpret_cast<QThreadData *>(pthread_getspecific(current_thread_data_key)); if (!data) { void *a; if (QInternal::activateCallbacks(QInternal::AdoptCurrentThread, &a)) { QThread *adopted = static_cast<QThread*>(a); Q_ASSERT(adopted); data = QThreadData::get2(adopted); pthread_setspecific(current_thread_data_key, data); adopted->d_func()->running = true; adopted->d_func()->finished = false; static_cast<QAdoptedThread *>(adopted)->init(); } else { data = new QThreadData; pthread_setspecific(current_thread_data_key, data); data->thread = new QAdoptedThread(data); data->deref(); } (void) q_atomic_test_and_set_ptr(&QCoreApplicationPrivate::theMainThread, 0, data->thread); } return data; }
Logger *ClassLogger::logger(const QObject *pObject) { Q_ASSERT_X(pObject, "ClassLogger::logger()", "pObject must not be null"); #if QT_VERSION < QT_VERSION_CHECK(4, 4, 0) if (!mpLogger) q_atomic_test_and_set_ptr(&mpLogger, 0, LogManager::logger(QLatin1String(pObject->metaObject()->className()))); return const_cast<Logger *>(mpLogger); #elif QT_VERSION < QT_VERSION_CHECK(5, 0, 0) if (!static_cast<Logger *>(mpLogger)) mpLogger.testAndSetOrdered(0, LogManager::logger(QLatin1String(pObject->metaObject()->className()))); return const_cast<Logger *>(static_cast<Logger *>(mpLogger)); #else if (!static_cast<Logger *>(mpLogger.loadAcquire())) mpLogger.testAndSetOrdered(0, LogManager::logger(QLatin1String(pObject->metaObject()->className()))); return const_cast<Logger *>(static_cast<Logger *>(mpLogger.loadAcquire())); #endif }
/* 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; }