QThread: Reuse isMainThread()
Internally, reuse threadId and theMainThreadId. Change-Id: Iea6e7d8fcbcaf7e2f4dbf8ab33890d0f7954edc0 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
parent
de0f145022
commit
159ea47e2f
@ -65,7 +65,7 @@ QThreadData::~QThreadData()
|
||||
// crashing during QCoreApplicationData's global static cleanup we need to
|
||||
// safeguard the main thread here.. This fix is a bit crude, but it solves
|
||||
// the problem...
|
||||
if (this->thread.loadAcquire() == QCoreApplicationPrivate::theMainThread.loadAcquire()) {
|
||||
if (threadId.loadAcquire() == QCoreApplicationPrivate::theMainThreadId.loadAcquire()) {
|
||||
QCoreApplicationPrivate::theMainThread.storeRelease(nullptr);
|
||||
QCoreApplicationPrivate::theMainThreadId.storeRelaxed(nullptr);
|
||||
QThreadData::clearCurrentThreadData();
|
||||
@ -1084,7 +1084,7 @@ QThreadData *QThreadData::current(bool createIfNecessary)
|
||||
data->threadId.storeRelaxed(Qt::HANDLE(data->thread.loadAcquire()));
|
||||
data->deref();
|
||||
data->isAdopted = true;
|
||||
if (!QCoreApplicationPrivate::theMainThread.loadAcquire()) {
|
||||
if (!QCoreApplicationPrivate::theMainThreadId.loadAcquire()) {
|
||||
QCoreApplicationPrivate::theMainThread.storeRelease(data->thread.loadRelaxed());
|
||||
QCoreApplicationPrivate::theMainThreadId.storeRelaxed(data->threadId.loadRelaxed());
|
||||
}
|
||||
@ -1207,11 +1207,11 @@ bool QThread::event(QEvent *event)
|
||||
|
||||
void QThread::requestInterruption()
|
||||
{
|
||||
if (this == QCoreApplicationPrivate::theMainThread.loadAcquire()) {
|
||||
Q_D(QThread);
|
||||
if (d->threadId() == QCoreApplicationPrivate::theMainThreadId.loadAcquire()) {
|
||||
qWarning("QThread::requestInterruption has no effect on the main thread");
|
||||
return;
|
||||
}
|
||||
Q_D(QThread);
|
||||
QMutexLocker locker(&d->mutex);
|
||||
if (!d->running || d->finished || d->isInFinish)
|
||||
return;
|
||||
|
@ -191,7 +191,7 @@ QThreadData *QThreadData::current(bool createIfNecessary)
|
||||
data->deref();
|
||||
data->isAdopted = true;
|
||||
data->threadId.storeRelaxed(to_HANDLE(pthread_self()));
|
||||
if (!QCoreApplicationPrivate::theMainThread.loadAcquire()) {
|
||||
if (!QCoreApplicationPrivate::theMainThreadId.loadAcquire()) {
|
||||
QCoreApplicationPrivate::theMainThread.storeRelease(data->thread.loadRelaxed());
|
||||
QCoreApplicationPrivate::theMainThreadId.storeRelaxed(data->threadId.loadRelaxed());
|
||||
}
|
||||
|
@ -87,7 +87,7 @@ QThreadData *QThreadData::current(bool createIfNecessary)
|
||||
threadData->isAdopted = true;
|
||||
threadData->threadId.storeRelaxed(reinterpret_cast<Qt::HANDLE>(quintptr(GetCurrentThreadId())));
|
||||
|
||||
if (!QCoreApplicationPrivate::theMainThread) {
|
||||
if (!QCoreApplicationPrivate::theMainThreadId) {
|
||||
QCoreApplicationPrivate::theMainThread = threadData->thread.loadRelaxed();
|
||||
QCoreApplicationPrivate::theMainThreadId.storeRelaxed(threadData->threadId.loadRelaxed());
|
||||
} else {
|
||||
|
@ -1041,7 +1041,7 @@ void tst_QCoreApplication::addRemoveLibPaths()
|
||||
static bool theMainThreadIsSet()
|
||||
{
|
||||
// QCoreApplicationPrivate::mainThread() has a Q_ASSERT we'd trigger
|
||||
return QCoreApplicationPrivate::theMainThread.loadRelaxed() != nullptr;
|
||||
return QCoreApplicationPrivate::theMainThreadId.loadRelaxed() != nullptr;
|
||||
}
|
||||
|
||||
static bool theMainThreadWasUnset = !theMainThreadIsSet(); // global static
|
||||
@ -1053,8 +1053,8 @@ void tst_QCoreApplication::theMainThread()
|
||||
int argc = 1;
|
||||
char *argv[] = { const_cast<char*>(QTest::currentAppName()) };
|
||||
TestApplication app(argc, argv);
|
||||
QVERIFY(QCoreApplicationPrivate::theMainThread.loadRelaxed());
|
||||
QCOMPARE(QCoreApplicationPrivate::theMainThread.loadRelaxed(), thread());
|
||||
QVERIFY(QCoreApplicationPrivate::theMainThreadId.loadRelaxed());
|
||||
QVERIFY(QThread::isMainThread());
|
||||
QCOMPARE(app.thread(), thread());
|
||||
QCOMPARE(app.thread(), QThread::currentThread());
|
||||
}
|
||||
@ -1067,7 +1067,7 @@ static void createQObjectOnDestruction()
|
||||
|
||||
#if !defined(QT_QGUIAPPLICATIONTEST) && !defined(Q_OS_WIN)
|
||||
// QCoreApplicationData's global static destructor has run and cleaned up
|
||||
// the QAdoptedThrad.
|
||||
// the QAdoptedThread.
|
||||
if (theMainThreadIsSet())
|
||||
qFatal("theMainThreadIsSet() returned true; some QObject must have leaked");
|
||||
#endif
|
||||
|
Loading…
x
Reference in New Issue
Block a user