From 1fe717e9125e896c92f281922e87f8158b15c7af Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sat, 6 Aug 2022 22:57:58 +0200 Subject: [PATCH] Allow cancellation of un-started jobs (#2777). --- src/lib/job.cc | 14 ++++++-------- test/job_manager_test.cc | 22 ++++++++++++++++++++++ 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; + + vector> jobs; + for (int i = 0; i < 2; ++i) { + auto job = make_shared(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()); +} + -- 2.30.2