summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/corelib/thread/qthread.cpp25
-rw-r--r--src/corelib/thread/qthread_p.h2
-rw-r--r--src/corelib/thread/qthread_unix.cpp9
-rw-r--r--src/corelib/thread/qthread_win.cpp10
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<Qt::HANDLE>(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;
}