X-Git-Url: https://git.carlh.net/gitweb/?p=dcpomatic.git;a=blobdiff_plain;f=src%2Flib%2Fjob_manager.cc;h=9fcd86f2d38b7c034a332740a74457f672bd1b9b;hp=608df7ef0af9063729824f7c3967d6d76b7a02fe;hb=a6c4b4fa16d9c6597e362044b875f3d6df80753f;hpb=d41a59b6ef7a8c935f182d498ae4df0bdd66ba02 diff --git a/src/lib/job_manager.cc b/src/lib/job_manager.cc index 608df7ef0..9fcd86f2d 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 @@ -74,7 +75,7 @@ JobManager::~JobManager () { boost::mutex::scoped_lock lm (_mutex); _terminate = true; - _empty_condition.notify_all (); + _schedule_condition.notify_all(); } try { @@ -89,7 +90,7 @@ JobManager::add (shared_ptr j) { boost::mutex::scoped_lock lm (_mutex); _jobs.push_back (j); - _empty_condition.notify_all (); + _schedule_condition.notify_all(); } emit (boost::bind(boost::ref(JobAdded), weak_ptr(j))); @@ -106,7 +107,7 @@ JobManager::add_after (shared_ptr after, shared_ptr j) auto i = find (_jobs.begin(), _jobs.end(), after); DCPOMATIC_ASSERT (i != _jobs.end()); _jobs.insert (i, j); - _empty_condition.notify_all (); + _schedule_condition.notify_all(); } emit (boost::bind(boost::ref(JobAdded), weak_ptr(j))); @@ -165,9 +166,11 @@ JobManager::scheduler () bool have_running = false; for (auto i: _jobs) { - if (have_running && i->running()) { + if ((have_running || _paused) && i->running()) { + /* We already have a running job, or are totally paused, so this job should not be running */ i->pause_by_priority(); - } else if (!have_running && (i->is_new() || i->paused_by_priority())) { + } else if (!have_running && !_paused && (i->is_new() || i->paused_by_priority())) { + /* We don't have a running job, and we should have one, so start/resume this */ if (i->is_new()) { _connections.push_back (i->FinishedImmediate.connect(bind(&JobManager::job_finished, this))); i->start (); @@ -182,7 +185,7 @@ JobManager::scheduler () } } - _empty_condition.wait (lm); + _schedule_condition.wait(lm); } } @@ -196,7 +199,7 @@ JobManager::job_finished () _last_active_job = optional(); } - _empty_condition.notify_all (); + _schedule_condition.notify_all(); } @@ -226,7 +229,7 @@ JobManager::analyse_audio ( shared_ptr playlist, bool from_zero, boost::signals2::connection& connection, - function ready + function ready ) { { @@ -249,7 +252,7 @@ JobManager::analyse_audio ( job = make_shared (film, playlist, from_zero); connection = job->Finished.connect (ready); _jobs.push_back (job); - _empty_condition.notify_all (); + _schedule_condition.notify_all (); } emit (boost::bind (boost::ref (JobAdded), weak_ptr (job))); @@ -261,7 +264,7 @@ JobManager::analyse_subtitles ( shared_ptr film, shared_ptr content, boost::signals2::connection& connection, - function ready + function ready ) { { @@ -284,7 +287,7 @@ JobManager::analyse_subtitles ( job = make_shared(film, content); connection = job->Finished.connect (ready); _jobs.push_back (job); - _empty_condition.notify_all (); + _schedule_condition.notify_all (); } emit (boost::bind(boost::ref(JobAdded), weak_ptr(job))); @@ -294,84 +297,52 @@ 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) { - _empty_condition.notify_all (); - emit (boost::bind(boost::ref(JobsReordered))); - } + _schedule_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) { - _empty_condition.notify_all (); - emit (boost::bind(boost::ref(JobsReordered))); - } + _schedule_condition.notify_all(); + emit(boost::bind(boost::ref(JobsReordered))); } +/** Pause all job processing */ void JobManager::pause () { boost::mutex::scoped_lock lm (_mutex); - - if (_paused) { - return; - } - - for (auto i: _jobs) { - if (i->pause_by_user()) { - _paused_job = i; - } - } - _paused = true; + _schedule_condition.notify_all(); } +/** Resume processing jobs after a previous pause() */ void JobManager::resume () { boost::mutex::scoped_lock lm (_mutex); - if (!_paused) { - return; - } - - if (_paused_job) { - _paused_job->resume (); - } - - _paused_job.reset (); _paused = false; + _schedule_condition.notify_all(); }