diff options
Diffstat (limited to 'src/corelib/thread/qthread_unix.cpp')
-rw-r--r-- | src/corelib/thread/qthread_unix.cpp | 33 |
1 files changed, 19 insertions, 14 deletions
diff --git a/src/corelib/thread/qthread_unix.cpp b/src/corelib/thread/qthread_unix.cpp index ee66e1c3c3..556f05018f 100644 --- a/src/corelib/thread/qthread_unix.cpp +++ b/src/corelib/thread/qthread_unix.cpp @@ -20,7 +20,9 @@ # endif #endif -#include <private/qeventdispatcher_unix_p.h> +#if !defined(Q_OS_WASM) +# include <private/qeventdispatcher_unix_p.h> +#endif #include "qthreadstorage.h" @@ -189,8 +191,10 @@ 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()); + } } return data; } @@ -275,11 +279,15 @@ void terminate_on_exception(T &&t) void *QThreadPrivate::start(void *arg) { -#if !defined(Q_OS_ANDROID) +#ifdef PTHREAD_CANCEL_DISABLE pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, nullptr); #endif - pthread_cleanup_push(QThreadPrivate::finish, arg); - +#if !defined(Q_OS_QNX) + // On QNX, calling finish() from a thread_local destructor causes the C + // library to hang. + static thread_local +#endif + auto cleanup = qScopeGuard([=] { finish(arg); }); terminate_on_exception([&] { QThread *thr = reinterpret_cast<QThread *>(arg); QThreadData *data = QThreadData::get2(thr); @@ -317,18 +325,14 @@ void *QThreadPrivate::start(void *arg) #endif emit thr->started(QThread::QPrivateSignal()); -#if !defined(Q_OS_ANDROID) +#ifdef PTHREAD_CANCEL_DISABLE pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, nullptr); pthread_testcancel(); #endif thr->run(); }); - // This pop runs finish() below. It's outside the try/catch (and has its - // own try/catch) to prevent finish() to be run in case an exception is - // thrown. - pthread_cleanup_pop(1); - + // The qScopeGuard above call runs finish() below. return nullptr; } @@ -345,6 +349,7 @@ void QThreadPrivate::finish(void *arg) void *data = &d->data->tls; locker.unlock(); emit thr->finished(QThread::QPrivateSignal()); + qCDebug(lcDeleteLater) << "Sending deferred delete events as part of finishing thread" << thr; QCoreApplication::sendPostedEvents(nullptr, QEvent::DeferredDelete); QThreadStorageData::finish((void **)data); locker.relock(); @@ -360,7 +365,7 @@ void QThreadPrivate::finish(void *arg) d->running = false; d->finished = true; - d->interruptionRequested = false; + d->interruptionRequested.store(false, std::memory_order_relaxed); d->isInFinish = false; d->data->threadId.storeRelaxed(nullptr); @@ -502,7 +507,7 @@ static void qt_nanosleep(timespec amount) // nanosleep is POSIX.1-1993 int r; - EINTR_LOOP(r, nanosleep(&amount, &amount)); + QT_EINTR_LOOP(r, nanosleep(&amount, &amount)); } void QThread::sleep(unsigned long secs) @@ -637,7 +642,7 @@ void QThread::start(Priority priority) d->finished = false; d->returnCode = 0; d->exited = false; - d->interruptionRequested = false; + d->interruptionRequested.store(false, std::memory_order_relaxed); pthread_attr_t attr; pthread_attr_init(&attr); |