From b21b98c81066a85be556dec87a238650729dfe00 Mon Sep 17 00:00:00 2001 From: samcake Date: Thu, 15 Feb 2018 11:24:20 -0800 Subject: [PATCH] Add a way to early abort a task from a Job, apply that to the highlight effect to shave unecessary work --- .../render-utils/src/HighlightEffect.cpp | 2 +- libraries/task/src/task/Task.cpp | 6 ++-- libraries/task/src/task/Task.h | 28 +++++++++++++------ 3 files changed, 23 insertions(+), 13 deletions(-) diff --git a/libraries/render-utils/src/HighlightEffect.cpp b/libraries/render-utils/src/HighlightEffect.cpp index de13188733..0bf8e7fa71 100644 --- a/libraries/render-utils/src/HighlightEffect.cpp +++ b/libraries/render-utils/src/HighlightEffect.cpp @@ -455,7 +455,7 @@ void SelectionToHighlight::run(const render::RenderContextPointer& renderContext } if (numLayers == 0) { - renderContext->abortTask(); + renderContext->taskFlow.abortTask(); } } diff --git a/libraries/task/src/task/Task.cpp b/libraries/task/src/task/Task.cpp index bb65f15b7c..621d77d7bf 100644 --- a/libraries/task/src/task/Task.cpp +++ b/libraries/task/src/task/Task.cpp @@ -20,15 +20,15 @@ JobContext::JobContext(const QLoggingCategory& category) : JobContext::~JobContext() { } -void JobContext::resetTaskFlow() { +void TaskFlow::reset() { _doAbortTask = false; } -void JobContext::abortTask() { +void TaskFlow::abortTask() { _doAbortTask = true; } -bool JobContext::doAbortTask() const { +bool TaskFlow::doAbortTask() const { return _doAbortTask; } diff --git a/libraries/task/src/task/Task.h b/libraries/task/src/task/Task.h index 1f1fb79ee1..34cdbb5439 100644 --- a/libraries/task/src/task/Task.h +++ b/libraries/task/src/task/Task.h @@ -27,6 +27,21 @@ template class JobT; template class TaskT; class JobNoIO {}; +class TaskFlow { +public: + TaskFlow() = default; + ~TaskFlow() = default; + + // called after each job + void reset(); + + void abortTask(); + bool doAbortTask() const; + +protected: + bool _doAbortTask{ false }; +}; + class JobContext { public: JobContext(const QLoggingCategory& category); @@ -35,15 +50,10 @@ public: std::shared_ptr jobConfig { nullptr }; const QLoggingCategory& profileCategory; - // control flow commands - void resetTaskFlow(); - void abortTask(); - - // Check command flow - bool doAbortTask() const; + // Task flow control + TaskFlow taskFlow{}; protected: - bool _doAbortTask{ false }; }; using JobContextPointer = std::shared_ptr; @@ -316,8 +326,8 @@ public: if (config->alwaysEnabled || config->enabled) { for (auto job : TaskConcept::_jobs) { job.run(jobContext); - if (jobContext->doAbortTask()) { - jobContext->resetTaskFlow(); + if (jobContext->taskFlow.doAbortTask()) { + jobContext->taskFlow.reset(); return; } }