diff options
Diffstat (limited to 'src/corelib/thread/qfutureinterface.cpp')
-rw-r--r-- | src/corelib/thread/qfutureinterface.cpp | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/src/corelib/thread/qfutureinterface.cpp b/src/corelib/thread/qfutureinterface.cpp index f29f950a1f..dfc905e828 100644 --- a/src/corelib/thread/qfutureinterface.cpp +++ b/src/corelib/thread/qfutureinterface.cpp @@ -858,12 +858,25 @@ void QFutureInterfaceBase::setContinuation(std::function<void(const QFutureInter } } +void QFutureInterfaceBase::cleanContinuation() +{ + if (!d) + return; + + // This is called when the associated QPromise is being destroyed. + // Clear the continuation, to make sure it doesn't keep any ref-counted + // copies of this, so that the allocated memory can be freed. + QMutexLocker lock(&d->continuationMutex); + d->continuation = nullptr; +} + void QFutureInterfaceBase::runContinuation() const { QMutexLocker lock(&d->continuationMutex); if (d->continuation) { + auto fn = std::exchange(d->continuation, nullptr); lock.unlock(); - d->continuation(*this); + fn(*this); } } |