summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2025-02-22 01:36:46 +0100
committerCarl Hetherington <cth@carlh.net>2025-02-23 01:47:38 +0100
commit5980b854a710d4c63b3077f73cd671b1d388939b (patch)
tree55525c745ff6e4586cad148d6a9d368e30bc8c16 /src/lib
parent1e50de1e7f3eb2b22fd1df815722355a1f853088 (diff)
Add JobManager::cancel_all_jobs().
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/job_manager.cc18
-rw-r--r--src/lib/job_manager.h2
2 files changed, 20 insertions, 0 deletions
diff --git a/src/lib/job_manager.cc b/src/lib/job_manager.cc
index 3fac8e6fa..a53eb6ebd 100644
--- a/src/lib/job_manager.cc
+++ b/src/lib/job_manager.cc
@@ -348,3 +348,21 @@ JobManager::resume ()
_paused = false;
_schedule_condition.notify_all();
}
+
+
+void
+JobManager::cancel_all_jobs()
+{
+ boost::mutex::scoped_lock lm(_mutex);
+ auto jobs = _jobs;
+ lm.unlock();
+
+ /* Calling Job::cancel() will result in JobManager::job_finished() being called, so we need
+ * to do this without a lock on _mutex. I think the worst case is that we fail to stop a
+ * job that got started since we lm.unlock()ed.
+ */
+ for (auto job: jobs) {
+ job->cancel();
+ }
+}
+
diff --git a/src/lib/job_manager.h b/src/lib/job_manager.h
index b4cb49060..9e28c4362 100644
--- a/src/lib/job_manager.h
+++ b/src/lib/job_manager.h
@@ -84,6 +84,8 @@ public:
std::function<void (Job::Result)> ready
);
+ void cancel_all_jobs();
+
boost::signals2::signal<void (std::weak_ptr<Job>)> JobAdded;
boost::signals2::signal<void ()> JobsReordered;
boost::signals2::signal<void (boost::optional<std::string>, boost::optional<std::string>)> ActiveJobsChanged;