X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fjob_manager.cc;h=f31a00a18b33f0bce674f0406b06197f8fbea691;hb=99428af22969a6cfb1dbd2053a9356bb23b3182f;hp=a841fa60bd553698a873e7105d5f2086e8e4040b;hpb=1d347f4ed0f7840236a91477075f4dc7af16f23d;p=dcpomatic.git diff --git a/src/lib/job_manager.cc b/src/lib/job_manager.cc index a841fa60b..f31a00a18 100644 --- a/src/lib/job_manager.cc +++ b/src/lib/job_manager.cc @@ -26,7 +26,6 @@ #include "job_manager.h" #include "job.h" #include "cross.h" -#include "ui_signaller.h" using std::string; using std::list; @@ -37,9 +36,23 @@ using boost::weak_ptr; JobManager* JobManager::_instance = 0; JobManager::JobManager () - : _last_active_jobs (false) + : _terminate (false) + , _last_active_jobs (false) + , _scheduler (new boost::thread (boost::bind (&JobManager::scheduler, this))) { - boost::thread (boost::bind (&JobManager::scheduler, this)); + +} + +JobManager::~JobManager () +{ + { + boost::mutex::scoped_lock lm (_mutex); + _terminate = true; + } + + if (_scheduler->joinable ()) { + _scheduler->join (); + } } shared_ptr @@ -50,10 +63,8 @@ JobManager::add (shared_ptr j) _jobs.push_back (j); } - if (ui_signaller) { - ui_signaller->emit (boost::bind (boost::ref (JobAdded), weak_ptr (j))); - } - + emit (boost::bind (boost::ref (JobAdded), weak_ptr (j))); + return j; } @@ -87,31 +98,35 @@ JobManager::errors () const } return false; -} +} void JobManager::scheduler () { - while (1) { + while (true) { bool active_jobs = false; { boost::mutex::scoped_lock lm (_mutex); + if (_terminate) { + return; + } + for (list >::iterator i = _jobs.begin(); i != _jobs.end(); ++i) { if (!(*i)->finished ()) { active_jobs = true; } - + if ((*i)->running ()) { /* Something is already happening */ break; } - + if ((*i)->is_new()) { (*i)->start (); - + /* Only start one job at once */ break; } @@ -120,9 +135,7 @@ JobManager::scheduler () if (active_jobs != _last_active_jobs) { _last_active_jobs = active_jobs; - if (ui_signaller) { - ui_signaller->emit (boost::bind (boost::ref (ActiveJobsChanged), active_jobs)); - } + emit (boost::bind (boost::ref (ActiveJobsChanged), active_jobs)); } dcpomatic_sleep (1); @@ -138,3 +151,10 @@ JobManager::instance () return _instance; } + +void +JobManager::drop () +{ + delete _instance; + _instance = 0; +}