summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lib/job.cc14
-rw-r--r--test/job_manager_test.cc22
2 files changed, 28 insertions, 8 deletions
diff --git a/src/lib/job.cc b/src/lib/job.cc
index 5bed3f0d2..8f0a7474f 100644
--- a/src/lib/job.cc
+++ b/src/lib/job.cc
@@ -589,17 +589,15 @@ Job::remaining_time () const
void
Job::cancel ()
{
- if (!_thread.joinable()) {
- return;
- }
+ if (_thread.joinable()) {
+ if (paused_by_user() || paused_by_priority()) {
+ resume ();
+ }
- if (paused_by_user() || paused_by_priority()) {
- resume ();
+ _thread.interrupt ();
+ _thread.join ();
}
- _thread.interrupt ();
- _thread.join ();
-
set_state (FINISHED_CANCELLED);
}
diff --git a/test/job_manager_test.cc b/test/job_manager_test.cc
index e11423575..4a2f8bde5 100644
--- a/test/job_manager_test.cc
+++ b/test/job_manager_test.cc
@@ -65,6 +65,7 @@ public:
if (finished ()) {
return;
}
+ boost::this_thread::interruption_point();
}
}
@@ -139,3 +140,24 @@ BOOST_AUTO_TEST_CASE (job_manager_test2)
BOOST_REQUIRE (!wait_for_jobs());
}
+
+BOOST_AUTO_TEST_CASE(cancel_job_test)
+{
+ shared_ptr<Film> film;
+
+ vector<shared_ptr<TestJob>> jobs;
+ for (int i = 0; i < 2; ++i) {
+ auto job = make_shared<TestJob>(film);
+ jobs.push_back(job);
+ JobManager::instance()->add(job);
+ }
+
+ jobs[1]->cancel();
+ jobs[0]->cancel();
+
+ dcpomatic_sleep_seconds(1);
+
+ BOOST_CHECK(jobs[0]->finished_cancelled());
+ BOOST_CHECK(jobs[1]->finished_cancelled());
+}
+