summaryrefslogtreecommitdiffstats
path: root/tests/auto
diff options
context:
space:
mode:
authorSona Kurazyan <sona.kurazyan@qt.io>2021-10-06 10:04:54 +0200
committerSona Kurazyan <sona.kurazyan@qt.io>2021-10-08 17:17:20 +0200
commitce59ccb3341223cda4f7ef2469d86326c6a116e8 (patch)
tree9084f53c7f50d349694a77a9e665a984ba1776de /tests/auto
parent22248a4e96a49dbccfeb5c3deb26941a1f40a66e (diff)
Optimize QPromise destructor
Unify cancel and finish in QPromise destructor in a single call. This saves us one extra mutex lock and atomic state change. Task-number: QTBUG-84977 Change-Id: Iac06302c39a2863008b27325fcf6792d4f58c8ae Reviewed-by: MÃ¥rten Nordheim <marten.nordheim@qt.io>
Diffstat (limited to 'tests/auto')
-rw-r--r--tests/auto/corelib/thread/qfuture/tst_qfuture.cpp34
-rw-r--r--tests/auto/corelib/thread/qfuturewatcher/tst_qfuturewatcher.cpp38
2 files changed, 72 insertions, 0 deletions
diff --git a/tests/auto/corelib/thread/qfuture/tst_qfuture.cpp b/tests/auto/corelib/thread/qfuture/tst_qfuture.cpp
index 7703261832..a6be2e9727 100644
--- a/tests/auto/corelib/thread/qfuture/tst_qfuture.cpp
+++ b/tests/auto/corelib/thread/qfuture/tst_qfuture.cpp
@@ -107,6 +107,7 @@ private slots:
void futureInterface();
void refcounting();
void cancel();
+ void cancelAndFinish();
void statePropagation();
void multipleResults();
void indexedResults();
@@ -865,6 +866,39 @@ void tst_QFuture::cancel()
}
}
+void tst_QFuture::cancelAndFinish()
+{
+ {
+ QFutureInterface<void> fi;
+
+ fi.reportStarted();
+ fi.cancelAndFinish();
+
+ QVERIFY(fi.isStarted());
+ QVERIFY(!fi.isRunning());
+ QVERIFY(!fi.isSuspended());
+ QVERIFY(!fi.isSuspending());
+ QVERIFY(fi.isCanceled());
+ QVERIFY(fi.isFinished());
+ }
+
+ // The same with suspended state
+ {
+ QFutureInterface<void> fi;
+
+ fi.reportStarted();
+ fi.setSuspended(true);
+ fi.cancelAndFinish();
+
+ QVERIFY(fi.isStarted());
+ QVERIFY(!fi.isRunning());
+ QVERIFY(!fi.isSuspended());
+ QVERIFY(!fi.isSuspending());
+ QVERIFY(fi.isCanceled());
+ QVERIFY(fi.isFinished());
+ }
+}
+
void tst_QFuture::statePropagation()
{
QFuture<void> f1;
diff --git a/tests/auto/corelib/thread/qfuturewatcher/tst_qfuturewatcher.cpp b/tests/auto/corelib/thread/qfuturewatcher/tst_qfuturewatcher.cpp
index 33ecfb9cab..34068f4f51 100644
--- a/tests/auto/corelib/thread/qfuturewatcher/tst_qfuturewatcher.cpp
+++ b/tests/auto/corelib/thread/qfuturewatcher/tst_qfuturewatcher.cpp
@@ -46,6 +46,8 @@ private slots:
void startFinish();
void progressValueChanged();
void canceled();
+ void cancelAndFinish_data();
+ void cancelAndFinish();
void resultAt();
void resultReadyAt();
void futureSignals();
@@ -229,6 +231,42 @@ void tst_QFutureWatcher::canceled()
future.waitForFinished();
}
+void tst_QFutureWatcher::cancelAndFinish_data()
+{
+ QTest::addColumn<bool>("isCanceled");
+ QTest::addColumn<bool>("isFinished");
+
+ QTest::addRow("running") << false << false;
+ QTest::addRow("canceled") << true << false;
+ QTest::addRow("finished") << false << true;
+ QTest::addRow("canceledAndFinished") << true << true;
+}
+
+void tst_QFutureWatcher::cancelAndFinish()
+{
+ QFETCH(bool, isCanceled);
+ QFETCH(bool, isFinished);
+
+ QFutureInterface<void> fi;
+ QFutureWatcher<void> futureWatcher;
+ QSignalSpy finishedSpy(&futureWatcher, &QFutureWatcher<void>::finished);
+ QSignalSpy canceledSpy(&futureWatcher, &QFutureWatcher<void>::canceled);
+ futureWatcher.setFuture(fi.future());
+
+ fi.reportStarted();
+
+ if (isCanceled)
+ fi.cancel();
+ if (isFinished)
+ fi.reportFinished();
+
+ fi.cancelAndFinish();
+
+ // The signals should be emitted only once
+ QTRY_COMPARE(canceledSpy.count(), 1);
+ QTRY_COMPARE(finishedSpy.count(), 1);
+}
+
class IntTask : public RunFunctionTaskBase<int>
{
public: