diff options
Diffstat (limited to 'async/src/async.h')
-rw-r--r-- | async/src/async.h | 21 |
1 files changed, 20 insertions, 1 deletions
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 | ||
95 | template<typename PrevOut, typename Out, typename ... In> | 97 | template<typename PrevOut, typename Out, typename ... In> |
@@ -470,19 +472,35 @@ Future<PrevOut>* Executor<PrevOut, Out, In ...>::chainup() | |||
470 | template<typename PrevOut, typename Out, typename ... In> | 472 | template<typename PrevOut, typename Out, typename ... In> |
471 | void Executor<PrevOut, Out, In ...>::exec() | 473 | void 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 | ||