summaryrefslogtreecommitdiffstats
path: root/async/src
diff options
context:
space:
mode:
Diffstat (limited to 'async/src')
-rw-r--r--async/src/async.cpp2
-rw-r--r--async/src/async.h21
2 files changed, 22 insertions, 1 deletions
diff --git a/async/src/async.cpp b/async/src/async.cpp
index c9fedc7..6eefd1b 100644
--- a/async/src/async.cpp
+++ b/async/src/async.cpp
@@ -27,6 +27,8 @@ using namespace Async;
27Private::ExecutorBase::ExecutorBase(const ExecutorBasePtr &parent) 27Private::ExecutorBase::ExecutorBase(const ExecutorBasePtr &parent)
28 : mPrev(parent) 28 : mPrev(parent)
29 , mResult(0) 29 , mResult(0)
30 , mIsRunning(false)
31 , mIsFinished(false)
30{ 32{
31} 33}
32 34
diff --git a/async/src/async.h b/async/src/async.h
index d21caf8..8296fbc 100644
--- a/async/src/async.h
+++ b/async/src/async.h
@@ -90,6 +90,8 @@ protected:
90 90
91 ExecutorBasePtr mPrev; 91 ExecutorBasePtr mPrev;
92 FutureBase *mResult; 92 FutureBase *mResult;
93 bool mIsRunning;
94 bool mIsFinished;
93}; 95};
94 96
95template<typename PrevOut, typename Out, typename ... In> 97template<typename PrevOut, typename Out, typename ... In>
@@ -470,19 +472,35 @@ Future<PrevOut>* Executor<PrevOut, Out, In ...>::chainup()
470template<typename PrevOut, typename Out, typename ... In> 472template<typename PrevOut, typename Out, typename ... In>
471void Executor<PrevOut, Out, In ...>::exec() 473void Executor<PrevOut, Out, In ...>::exec()
472{ 474{
473 mPrevFuture = chainup(); 475 // Don't chain up to job that already is running (or is finished)
476 if (mPrev && !mPrev->mIsRunning & !mPrev->mIsFinished) {
477 mPrevFuture = chainup();
478 } else if (mPrev && !mPrevFuture) {
479 // If previous job is running or finished, just get it's future
480 mPrevFuture = static_cast<Async::Future<PrevOut>*>(mPrev->result());
481 }
482
474 // Initialize our future 483 // Initialize our future
475 mResult = new Async::Future<Out>(); 484 mResult = new Async::Future<Out>();
485 auto fw = new Async::FutureWatcher<Out>();
486 QObject::connect(fw, &Async::FutureWatcher<Out>::futureReady,
487 [&]() {
488 mIsFinished = true;
489 fw->deleteLater();
490 });
491
476 if (!mPrevFuture || mPrevFuture->isFinished()) { 492 if (!mPrevFuture || mPrevFuture->isFinished()) {
477 if (mPrevFuture && mPrevFuture->errorCode() != 0) { 493 if (mPrevFuture && mPrevFuture->errorCode() != 0) {
478 if (mErrorFunc) { 494 if (mErrorFunc) {
479 mErrorFunc(mPrevFuture->errorCode(), mPrevFuture->errorMessage()); 495 mErrorFunc(mPrevFuture->errorCode(), mPrevFuture->errorMessage());
480 mResult->setFinished(); 496 mResult->setFinished();
497 mIsFinished = true;
481 return; 498 return;
482 } else { 499 } else {
483 // Propagate the error to next caller 500 // Propagate the error to next caller
484 } 501 }
485 } 502 }
503 mIsRunning = true;
486 previousFutureReady(); 504 previousFutureReady();
487 } else { 505 } else {
488 auto futureWatcher = new Async::FutureWatcher<PrevOut>(); 506 auto futureWatcher = new Async::FutureWatcher<PrevOut>();
@@ -500,6 +518,7 @@ void Executor<PrevOut, Out, In ...>::exec()
500 // Propagate the error to next caller 518 // Propagate the error to next caller
501 } 519 }
502 } 520 }
521 mIsRunning = true;
503 previousFutureReady(); 522 previousFutureReady();
504 }); 523 });
505 524