X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fjob_manager.cc;h=2b4e872998f72478614557014fe241a2d320d7f1;hb=dc06f6e964fa3baffc72d6548e47974468f2939f;hp=d8c0b02f2f210a58c863fe81d072dfecdd883468;hpb=8963f0007af1a312017b9627c18b82ec2a577591;p=dcpomatic.git diff --git a/src/lib/job_manager.cc b/src/lib/job_manager.cc index d8c0b02f2..2b4e87299 100644 --- a/src/lib/job_manager.cc +++ b/src/lib/job_manager.cc @@ -30,6 +30,7 @@ #include "film.h" #include "job.h" #include "job_manager.h" +#include "util.h" #include @@ -159,39 +160,30 @@ JobManager::scheduler () boost::mutex::scoped_lock lm (_mutex); - while (true) { - bool have_new = false; - bool have_running = false; - for (auto i: _jobs) { - if (i->running()) { - have_running = true; - } - if (i->is_new()) { - have_new = true; - } - } - - if ((!have_running && have_new) || _terminate) { - break; - } - - _empty_condition.wait (lm); - } - if (_terminate) { break; } + bool have_running = false; for (auto i: _jobs) { - if (i->is_new()) { - _connections.push_back (i->FinishedImmediate.connect(bind(&JobManager::job_finished, this))); - i->start (); + if (have_running && i->running()) { + i->pause_by_priority(); + } else if (!have_running && (i->is_new() || i->paused_by_priority())) { + if (i->is_new()) { + _connections.push_back (i->FinishedImmediate.connect(bind(&JobManager::job_finished, this))); + i->start (); + } else { + i->resume (); + } emit (boost::bind (boost::ref (ActiveJobsChanged), _last_active_job, i->json_name())); _last_active_job = i->json_name (); - /* Only start one job at once */ - break; + have_running = true; + } else if (!have_running && i->running()) { + have_running = true; } } + + _empty_condition.wait (lm); } } @@ -303,75 +295,34 @@ JobManager::analyse_subtitles ( void JobManager::increase_priority (shared_ptr job) { - bool changed = false; - { boost::mutex::scoped_lock lm (_mutex); - auto last = _jobs.end (); - for (auto i = _jobs.begin(); i != _jobs.end(); ++i) { - if (*i == job && last != _jobs.end()) { - swap (*i, *last); - changed = true; - break; - } - last = i; + auto iter = std::find(_jobs.begin(), _jobs.end(), job); + if (iter == _jobs.begin() || iter == _jobs.end()) { + return; } + swap(*iter, *std::prev(iter)); } - if (changed) { - priority_changed (); - } -} - - -void -JobManager::priority_changed () -{ - { - boost::mutex::scoped_lock lm (_mutex); - - bool first = true; - for (auto i: _jobs) { - if (first) { - if (i->is_new ()) { - i->start (); - } else if (i->paused_by_priority ()) { - i->resume (); - } - first = false; - } else { - if (i->running ()) { - i->pause_by_priority (); - } - } - } - } - - emit (boost::bind(boost::ref(JobsReordered))); + _empty_condition.notify_all(); + emit(boost::bind(boost::ref(JobsReordered))); } void JobManager::decrease_priority (shared_ptr job) { - bool changed = false; - { boost::mutex::scoped_lock lm (_mutex); - for (auto i = _jobs.begin(); i != _jobs.end(); ++i) { - auto next = i; - ++next; - if (*i == job && next != _jobs.end()) { - swap (*i, *next); - changed = true; - break; - } + auto iter = std::find(_jobs.begin(), _jobs.end(), job); + if (iter == _jobs.end() || std::next(iter) == _jobs.end()) { + return; } + swap(*iter, *std::next(iter)); } - if (changed) { - priority_changed (); - } + _empty_condition.notify_all(); + emit(boost::bind(boost::ref(JobsReordered))); } @@ -380,7 +331,7 @@ JobManager::pause () { boost::mutex::scoped_lock lm (_mutex); - if (_paused) { + if (_paused_job) { return; } @@ -389,8 +340,6 @@ JobManager::pause () _paused_job = i; } } - - _paused = true; } @@ -398,14 +347,11 @@ void JobManager::resume () { boost::mutex::scoped_lock lm (_mutex); - if (!_paused) { - return; - } - if (_paused_job) { - _paused_job->resume (); + if (!_paused_job) { + return; } - _paused_job.reset (); - _paused = false; + _paused_job->resume(); + _paused_job.reset(); }