diff options
| author | Carl Hetherington <cth@carlh.net> | 2018-08-16 23:14:57 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2018-08-16 23:14:57 +0100 |
| commit | bb990ccc49ee724a8af2ad80bde066374af4b68a (patch) | |
| tree | 4893842f188db4f268def9a2a518bc7858a099b0 /src/lib/job_manager.cc | |
| parent | 773346b1518c68dc7533b381a90e77ae276ae6bc (diff) | |
Add pause/resume to the batch converter (#1248).
Add some missing locking to JobManager::decrease_priority.
Diffstat (limited to 'src/lib/job_manager.cc')
| -rw-r--r-- | src/lib/job_manager.cc | 78 |
1 files changed, 59 insertions, 19 deletions
diff --git a/src/lib/job_manager.cc b/src/lib/job_manager.cc index 6d651d2ba..535830c0c 100644 --- a/src/lib/job_manager.cc +++ b/src/lib/job_manager.cc @@ -44,6 +44,7 @@ JobManager* JobManager::_instance = 0; JobManager::JobManager () : _terminate (false) + , _paused (false) , _scheduler (0) { @@ -150,21 +151,23 @@ JobManager::scheduler () return; } - BOOST_FOREACH (shared_ptr<Job> i, _jobs) { + if (!_paused) { + BOOST_FOREACH (shared_ptr<Job> i, _jobs) { - if (!i->finished ()) { - active_job = i->json_name (); - } + if (!i->finished ()) { + active_job = i->json_name (); + } - if (i->running ()) { - /* Something is already happening */ - break; - } + if (i->running ()) { + /* Something is already happening */ + break; + } - if (i->is_new()) { - i->start (); - /* Only start one job at once */ - break; + if (i->is_new()) { + i->start (); + /* Only start one job at once */ + break; + } } } } @@ -284,13 +287,16 @@ JobManager::decrease_priority (shared_ptr<Job> job) { bool changed = false; - for (list<shared_ptr<Job> >::iterator i = _jobs.begin(); i != _jobs.end(); ++i) { - list<shared_ptr<Job> >::iterator next = i; - ++next; - if (*i == job && next != _jobs.end()) { - swap (*i, *next); - changed = true; - break; + { + boost::mutex::scoped_lock lm (_mutex); + for (list<shared_ptr<Job> >::iterator i = _jobs.begin(); i != _jobs.end(); ++i) { + list<shared_ptr<Job> >::iterator next = i; + ++next; + if (*i == job && next != _jobs.end()) { + swap (*i, *next); + changed = true; + break; + } } } @@ -298,3 +304,37 @@ JobManager::decrease_priority (shared_ptr<Job> job) priority_changed (); } } + +void +JobManager::pause () +{ + boost::mutex::scoped_lock lm (_mutex); + + if (_paused) { + return; + } + + BOOST_FOREACH (shared_ptr<Job> i, _jobs) { + if (i->pause_by_user()) { + _paused_job = i; + } + } + + _paused = true; +} + +void +JobManager::resume () +{ + boost::mutex::scoped_lock lm (_mutex); + if (!_paused) { + return; + } + + if (_paused_job) { + _paused_job->resume (); + } + + _paused_job.reset (); + _paused = false; +} |
