summaryrefslogtreecommitdiff
path: root/src/lib/job.cc
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2013-04-15 15:00:35 +0100
committerCarl Hetherington <cth@carlh.net>2013-04-15 15:00:35 +0100
commita00ebbc68438e84076c65e99d0e70403afb4407d (patch)
tree6ee2f535eeb6b592c740e117d1f8f8657d6bcce8 /src/lib/job.cc
parent665bc942f86bd7a8aeb2b38f3e9c2cb6662e6edc (diff)
parent606b3f759238aa6c0d12de064b301bf36b428220 (diff)
Merge master.
Diffstat (limited to 'src/lib/job.cc')
-rw-r--r--src/lib/job.cc30
1 files changed, 28 insertions, 2 deletions
diff --git a/src/lib/job.cc b/src/lib/job.cc
index 78a7a7577..1c66d87d3 100644
--- a/src/lib/job.cc
+++ b/src/lib/job.cc
@@ -38,6 +38,7 @@ using boost::shared_ptr;
*/
Job::Job (shared_ptr<Film> f)
: _film (f)
+ , _thread (0)
, _state (NEW)
, _start_time (0)
, _progress_unknown (false)
@@ -52,7 +53,7 @@ Job::start ()
{
set_state (RUNNING);
_start_time = time (0);
- boost::thread (boost::bind (&Job::run_wrapper, this));
+ _thread = new boost::thread (boost::bind (&Job::run_wrapper, this));
}
/** A wrapper for the ::run() method to catch exceptions */
@@ -81,6 +82,10 @@ Job::run_wrapper ()
}
set_error (e.what(), m);
+
+ } catch (boost::thread_interrupted &) {
+
+ set_state (FINISHED_CANCELLED);
} catch (std::exception& e) {
@@ -124,7 +129,7 @@ bool
Job::finished () const
{
boost::mutex::scoped_lock lm (_state_mutex);
- return _state == FINISHED_OK || _state == FINISHED_ERROR;
+ return _state == FINISHED_OK || _state == FINISHED_ERROR || _state == FINISHED_CANCELLED;
}
/** @return true if the job has finished successfully */
@@ -143,6 +148,13 @@ Job::finished_in_error () const
return _state == FINISHED_ERROR;
}
+bool
+Job::finished_cancelled () const
+{
+ boost::mutex::scoped_lock lm (_state_mutex);
+ return _state == FINISHED_CANCELLED;
+}
+
/** Set the state of this job.
* @param s New state.
*/
@@ -177,6 +189,7 @@ Job::set_progress (float p)
boost::mutex::scoped_lock lm (_progress_mutex);
_progress_unknown = false;
_stack.back().normalised = p;
+ boost::this_thread::interruption_point ();
}
/** @return fractional overall progress, or -1 if not known */
@@ -289,6 +302,8 @@ Job::status () const
s << String::compose (_("OK (ran for %1)"), seconds_to_hms (_ran_for));
} else if (finished_in_error ()) {
s << String::compose (_("Error (%1)"), error_summary());
+ } else if (finished_cancelled ()) {
+ s << _("Cancelled");
}
return s.str ();
@@ -300,3 +315,14 @@ Job::remaining_time () const
{
return elapsed_time() / overall_progress() - elapsed_time();
}
+
+void
+Job::cancel ()
+{
+ if (!_thread) {
+ return;
+ }
+
+ _thread->interrupt ();
+ _thread->join ();
+}