diff --git a/src/corelib/thread/qthread.cpp b/src/corelib/thread/qthread.cpp index edfb77f1cf4..005666a7426 100644 --- a/src/corelib/thread/qthread.cpp +++ b/src/corelib/thread/qthread.cpp @@ -495,11 +495,8 @@ QThread::~QThread() Q_D(QThread); { QMutexLocker locker(&d->mutex); - if (d->isInFinish) { - locker.unlock(); - wait(); - locker.relock(); - } + if (d->isInFinish) + d->wait(locker, QDeadlineTimer::Forever); if (d->running && !d->finished && !d->data->isAdopted) qFatal("QThread: Destroyed while thread is still running"); diff --git a/src/corelib/thread/qthread_p.h b/src/corelib/thread/qthread_p.h index 69cad23f99a..afb10fbf9ac 100644 --- a/src/corelib/thread/qthread_p.h +++ b/src/corelib/thread/qthread_p.h @@ -198,6 +198,8 @@ public: uint stackSize; std::underlying_type_t priority; + bool wait(QMutexLocker &locker, QDeadlineTimer deadline); + #ifdef Q_OS_UNIX QWaitCondition thread_done; diff --git a/src/corelib/thread/qthread_unix.cpp b/src/corelib/thread/qthread_unix.cpp index 4dac10baade..4b6e0d8f3c8 100644 --- a/src/corelib/thread/qthread_unix.cpp +++ b/src/corelib/thread/qthread_unix.cpp @@ -837,6 +837,14 @@ bool QThread::wait(QDeadlineTimer deadline) if (d->finished || !d->running) return true; + return d->wait(locker, deadline); +} + +bool QThreadPrivate::wait(QMutexLocker &locker, QDeadlineTimer deadline) +{ + Q_ASSERT(locker.isLocked()); + QThreadPrivate *d = this; + while (d->running) { if (!d->thread_done.wait(locker.mutex(), deadline)) return false; diff --git a/src/corelib/thread/qthread_win.cpp b/src/corelib/thread/qthread_win.cpp index 712a6f07041..33dd03166cf 100644 --- a/src/corelib/thread/qthread_win.cpp +++ b/src/corelib/thread/qthread_win.cpp @@ -495,6 +495,13 @@ bool QThread::wait(QDeadlineTimer deadline) } if (d->finished || !d->running) return true; + return d->wait(locker, deadline); +} + +bool QThreadPrivate::wait(QMutexLocker &locker, QDeadlineTimer deadline) +{ + Q_ASSERT(locker.isLocked()); + QThreadPrivate *d = this; ++d->waiters; locker.mutex()->unlock();