Esempio n. 1
0
QThreadData *QThreadData::current()
{
    pthread_once(&current_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;
}
Esempio n. 2
0
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
}
Esempio n. 3
0
/*
    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;
}