diff options
-rw-r--r-- | src/concurrent/qtconcurrentrunbase.h | 7 | ||||
-rw-r--r-- | tests/auto/concurrent/qtconcurrentrun/tst_qtconcurrentrun.cpp | 14 |
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" |