Allow cancellation of un-started jobs (#2777).
authorCarl Hetherington <cth@carlh.net>
Sat, 6 Aug 2022 20:57:58 +0000 (22:57 +0200)
committerCarl Hetherington <cth@carlh.net>
Thu, 11 Aug 2022 20:40:59 +0000 (22:40 +0200)
src/lib/job.cc
test/job_manager_test.cc

index 5bed3f0d273c6b5216ce2bb0c67b3b52c3953db2..8f0a7474f90311ffc8c3fa912bc9b22ca57dad1e 100644 (file)
@@ -589,17 +589,15 @@ Job::remaining_time () const
 void
 Job::cancel ()
 {
 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);
 }
 
        set_state (FINISHED_CANCELLED);
 }
 
index e11423575f48a18b91d70aa020fc0cb1fa6c54c0..4a2f8bde5f97e8849dfb0347d273c6a0edba63c8 100644 (file)
@@ -65,6 +65,7 @@ public:
                        if (finished ()) {
                                return;
                        }
                        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_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());
+}
+