diff options
author | Sona Kurazyan <sona.kurazyan@qt.io> | 2022-03-23 09:30:23 +0100 |
---|---|---|
committer | Sona Kurazyan <sona.kurazyan@qt.io> | 2022-03-25 08:05:12 +0100 |
commit | 76a1c060ac76a9249febdb32e71fcddaf7fb2414 (patch) | |
tree | ccc35d91b646b1a03754cf151dd56b52babff5b2 /tests/auto/corelib/thread | |
parent | 837bfd6f145402c94570d1df4fb3446664cb7828 (diff) |
Always cancel unfinished QPromises on destruction
If the QPromise is being destroyed, we should signal the associated
futures to stop waiting. No matter in which state the promise is, if
it's not finished, we should always cancel to avoid infinite waits.
This is also what docs state:
"The promise implicitly transitions to a canceled state on destruction
unless finish() is called beforehand by the user."
Fixes: QTBUG-101284
Pick-to: 6.3 6.2
Change-Id: I65ebfefe03b79b41afacda78a4f49938c54d8b37
Reviewed-by: Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
Reviewed-by: Andrei Golubev <andrei.golubev@qt.io>
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
Reviewed-by: MÃ¥rten Nordheim <marten.nordheim@qt.io>
Diffstat (limited to 'tests/auto/corelib/thread')
-rw-r--r-- | tests/auto/corelib/thread/qpromise/tst_qpromise.cpp | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/tests/auto/corelib/thread/qpromise/tst_qpromise.cpp b/tests/auto/corelib/thread/qpromise/tst_qpromise.cpp index 52f4daa24a..5c20287e89 100644 --- a/tests/auto/corelib/thread/qpromise/tst_qpromise.cpp +++ b/tests/auto/corelib/thread/qpromise/tst_qpromise.cpp @@ -64,6 +64,7 @@ private slots: void cancelWhenDestroyed(); #endif void cancelWhenReassigned(); + void cancelWhenDestroyedWithoutStarting(); void finishWhenSwapped(); void cancelWhenMoved(); void waitUntilResumed(); @@ -505,6 +506,19 @@ void tst_QPromise::cancelWhenReassigned() #endif } +void tst_QPromise::cancelWhenDestroyedWithoutStarting() +{ + QFuture<void> future; + { + QPromise<void> promise; + future = promise.future(); + } + future.waitForFinished(); + QVERIFY(!future.isStarted()); + QVERIFY(future.isCanceled()); + QVERIFY(future.isFinished()); +} + void tst_QPromise::finishWhenSwapped() { #if !QT_CONFIG(cxx11_future) |