From f2b5c779cdee1afabca300b04187955c0009fe1c Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Wed, 6 Nov 2024 07:15:42 -0800 Subject: [PATCH] QThread: merge some Unix/Windows/no-thread code for QAdoptedThread It was duplicated in all three files. The remaining code is very similar, but I don't think we want to merge it any further. For one thing, we must set the thread-local variable before QAdoptedThread calls the QObject constructor. Change-Id: Iac9f7f7528085a1137d7fffdecf080a2b6e1aefe Reviewed-by: Ivan Solovev Reviewed-by: Edward Welbourne --- src/corelib/thread/qthread.cpp | 25 ++++++++++++++++--------- src/corelib/thread/qthread_p.h | 2 +- src/corelib/thread/qthread_unix.cpp | 9 --------- src/corelib/thread/qthread_win.cpp | 10 ---------- 4 files changed, 17 insertions(+), 29 deletions(-) diff --git a/src/corelib/thread/qthread.cpp b/src/corelib/thread/qthread.cpp index 5527cfcd84d..ae280e3671b 100644 --- a/src/corelib/thread/qthread.cpp +++ b/src/corelib/thread/qthread.cpp @@ -13,6 +13,8 @@ QT_BEGIN_NAMESPACE +using namespace Qt::StringLiterals; + /* QPostEventList */ @@ -113,6 +115,20 @@ QAbstractEventDispatcher *QThreadData::createEventDispatcher() QAdoptedThread::QAdoptedThread(QThreadData *data) : QThread(*new QThreadPrivate(data)) { + // avoid a cyclic reference count: QThreadData owns this QAdoptedThread + // object but QObject's constructor increased the count + data->deref(); + + data->isAdopted = true; + Qt::HANDLE id = QThread::currentThreadId(); + data->threadId.storeRelaxed(id); + if (!QCoreApplicationPrivate::theMainThreadId.loadAcquire()) { + // we are the main thread + QCoreApplicationPrivate::theMainThread.storeRelease(this); + QCoreApplicationPrivate::theMainThreadId.storeRelaxed(id); + setObjectName(u"Qt mainThread"_s); + } + // thread should be running and not finished for the lifetime // of the application (even if QCoreApplication goes away) #if QT_CONFIG(thread) @@ -1130,15 +1146,6 @@ QThreadData *QThreadData::current(bool createIfNecessary) if (!data && createIfNecessary) { data = new QThreadData; data->thread = new QAdoptedThread(data); - data->threadId.storeRelaxed(Qt::HANDLE(data->thread.loadAcquire())); - data->deref(); - data->isAdopted = true; - if (!QCoreApplicationPrivate::theMainThreadId.loadAcquire()) { - auto *mainThread = data->thread.loadRelaxed(); - mainThread->setObjectName("Qt mainThread"); - QCoreApplicationPrivate::theMainThread.storeRelease(mainThread); - QCoreApplicationPrivate::theMainThreadId.storeRelaxed(data->threadId.loadRelaxed()); - } } return data; } diff --git a/src/corelib/thread/qthread_p.h b/src/corelib/thread/qthread_p.h index 27b8e50e398..98eb6c193ac 100644 --- a/src/corelib/thread/qthread_p.h +++ b/src/corelib/thread/qthread_p.h @@ -363,7 +363,7 @@ class QAdoptedThread : public QThread Q_DECLARE_PRIVATE(QThread) public: - QAdoptedThread(QThreadData *data = nullptr); + QAdoptedThread(QThreadData *data); ~QAdoptedThread(); void init(); diff --git a/src/corelib/thread/qthread_unix.cpp b/src/corelib/thread/qthread_unix.cpp index 7dd7fd056ca..caca492be72 100644 --- a/src/corelib/thread/qthread_unix.cpp +++ b/src/corelib/thread/qthread_unix.cpp @@ -245,15 +245,6 @@ QThreadData *QThreadData::current(bool createIfNecessary) data = nullptr; QT_RETHROW; } - data->deref(); - data->isAdopted = true; - data->threadId.storeRelaxed(QThread::currentThreadId()); - if (!QCoreApplicationPrivate::theMainThreadId.loadAcquire()) { - auto *mainThread = data->thread.loadRelaxed(); - mainThread->setObjectName("Qt mainThread"); - QCoreApplicationPrivate::theMainThread.storeRelease(mainThread); - QCoreApplicationPrivate::theMainThreadId.storeRelaxed(data->threadId.loadRelaxed()); - } } return data; } diff --git a/src/corelib/thread/qthread_win.cpp b/src/corelib/thread/qthread_win.cpp index 61426546274..94b4e41133a 100644 --- a/src/corelib/thread/qthread_win.cpp +++ b/src/corelib/thread/qthread_win.cpp @@ -107,16 +107,6 @@ QThreadData *QThreadData::current(bool createIfNecessary) threadData = 0; QT_RETHROW; } - threadData->deref(); - threadData->isAdopted = true; - threadData->threadId.storeRelaxed(reinterpret_cast(quintptr(GetCurrentThreadId()))); - - if (!QCoreApplicationPrivate::theMainThreadId) { - auto *mainThread = threadData->thread.loadRelaxed(); - mainThread->setObjectName("Qt mainThread"); - QCoreApplicationPrivate::theMainThread.storeRelease(mainThread); - QCoreApplicationPrivate::theMainThreadId.storeRelaxed(threadData->threadId.loadRelaxed()); - } } return threadData; }