diff options
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/job.cc | 29 | ||||
| -rw-r--r-- | 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<float> 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<float> ()); } 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<const Film> _film; |
