From 66ba4487fa7bbf7a48d428dd49ce634cd62004d3 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Fri, 30 Sep 2016 11:35:18 +0100 Subject: [PATCH] Speed up response to a request to pause a job. --- src/lib/job.cc | 29 +++++++++++++++++++---------- src/lib/job.h | 1 + 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/lib/job.cc b/src/lib/job.cc index 51deca404..167692863 100644 --- a/src/lib/job.cc +++ b/src/lib/job.cc @@ -279,12 +279,27 @@ Job::elapsed_sub_time () const return time (0) - _sub_start_time; } +/** Check to see if this job has been interrupted or paused */ +void +Job::check_for_interruption_or_pause () +{ + boost::this_thread::interruption_point (); + + boost::mutex::scoped_lock lm (_state_mutex); + while (_state == PAUSED) { + emit (boost::bind (boost::ref (Progress))); + _pause_changed.wait (lm); + } +} + /** Set the progress of the current part of the job. * @param p Progress (from 0 to 1) */ void Job::set_progress (float p, bool force) { + check_for_interruption_or_pause (); + if (!force) { /* Check for excessively frequent progress reporting */ boost::mutex::scoped_lock lm (_progress_mutex); @@ -306,18 +321,11 @@ Job::set_progress (float p, bool force) void Job::set_progress_common (optional p) { - boost::mutex::scoped_lock lm (_progress_mutex); - _progress = p; - boost::this_thread::interruption_point (); - - boost::mutex::scoped_lock lm2 (_state_mutex); - while (_state == PAUSED) { - _pause_changed.wait (lm2); + { + boost::mutex::scoped_lock lm (_progress_mutex); + _progress = p; } - lm.unlock (); - lm2.unlock (); - emit (boost::bind (boost::ref (Progress))); } @@ -378,6 +386,7 @@ Job::set_error (string s, string d) void Job::set_progress_unknown () { + check_for_interruption_or_pause (); set_progress_common (optional ()); } diff --git a/src/lib/job.h b/src/lib/job.h index 804755ef8..660ddaa13 100644 --- a/src/lib/job.h +++ b/src/lib/job.h @@ -103,6 +103,7 @@ protected: void set_state (State); void set_error (std::string s, std::string d); int elapsed_sub_time () const; + void check_for_interruption_or_pause (); boost::shared_ptr _film; -- 2.30.2