summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/concurrent/qtconcurrentrunbase.h7
-rw-r--r--tests/auto/concurrent/qtconcurrentrun/tst_qtconcurrentrun.cpp14
2 files changed, 20 insertions, 1 deletions
diff --git a/src/concurrent/qtconcurrentrunbase.h b/src/concurrent/qtconcurrentrunbase.h
index 5333b38d8b..46a1715bad 100644
--- a/src/concurrent/qtconcurrentrunbase.h
+++ b/src/concurrent/qtconcurrentrunbase.h
@@ -84,7 +84,12 @@ public:
this->setRunnable(this);
this->reportStarted();
QFuture<T> theFuture = this->future();
- pool->start(this, /*m_priority*/ 0);
+ if (pool) {
+ pool->start(this, /*m_priority*/ 0);
+ } else {
+ this->reportCanceled();
+ this->reportFinished();
+ }
return theFuture;
}
diff --git a/tests/auto/concurrent/qtconcurrentrun/tst_qtconcurrentrun.cpp b/tests/auto/concurrent/qtconcurrentrun/tst_qtconcurrentrun.cpp
index a4eb2936b5..02eefc4f14 100644
--- a/tests/auto/concurrent/qtconcurrentrun/tst_qtconcurrentrun.cpp
+++ b/tests/auto/concurrent/qtconcurrentrun/tst_qtconcurrentrun.cpp
@@ -30,6 +30,8 @@
#include <QString>
#include <QtTest/QtTest>
+#include <atomic>
+
using namespace QtConcurrent;
class tst_QtConcurrentRun: public QObject
@@ -50,6 +52,7 @@ private slots:
#endif
void functor();
void lambda();
+ void nullThreadPool();
};
void light()
@@ -732,5 +735,16 @@ void tst_QtConcurrentRun::lambda()
}
}
+// QTBUG-98901
+void tst_QtConcurrentRun::nullThreadPool()
+{
+ QThreadPool *pool = nullptr;
+ std::atomic<bool> isInvoked(false);
+ auto future = run(pool, [&] { isInvoked = true; });
+ future.waitForFinished();
+ QVERIFY(future.isCanceled());
+ QVERIFY(!isInvoked);
+}
+
QTEST_MAIN(tst_QtConcurrentRun)
#include "tst_qtconcurrentrun.moc"