X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fjob_manager.cc;h=535830c0c43cc77cb42263f8af9f3e8164484251;hb=72b11d5eb036651b6ff68edf3ed270e8fc52960f;hp=6d651d2ba1d51adc531efc64b51c6c5f88002d31;hpb=ab1c8a67afba072b1c29f0c3c34aa9779643e66a;p=dcpomatic.git 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 i, _jobs) { + if (!_paused) { + BOOST_FOREACH (shared_ptr 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) { bool changed = false; - for (list >::iterator i = _jobs.begin(); i != _jobs.end(); ++i) { - list >::iterator next = i; - ++next; - if (*i == job && next != _jobs.end()) { - swap (*i, *next); - changed = true; - break; + { + boost::mutex::scoped_lock lm (_mutex); + for (list >::iterator i = _jobs.begin(); i != _jobs.end(); ++i) { + list >::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) priority_changed (); } } + +void +JobManager::pause () +{ + boost::mutex::scoped_lock lm (_mutex); + + if (_paused) { + return; + } + + BOOST_FOREACH (shared_ptr 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; +}