JobManager::JobManager ()
: _terminate (false)
, _paused (false)
- , _scheduler (0)
{
}
void
JobManager::start ()
{
- _scheduler = new boost::thread (boost::bind (&JobManager::scheduler, this));
+ _scheduler = boost::thread (boost::bind(&JobManager::scheduler, this));
#ifdef DCPOMATIC_LINUX
- pthread_setname_np (_scheduler->native_handle(), "job-scheduler");
+ pthread_setname_np (_scheduler.native_handle(), "job-scheduler");
#endif
}
{
boost::mutex::scoped_lock lm (_mutex);
_terminate = true;
+ _empty_condition.notify_all ();
}
- if (_scheduler) {
- /* Ideally this would be a DCPOMATIC_ASSERT(_scheduler->joinable()) but we
- can't throw exceptions from a destructor.
- */
- if (_scheduler->joinable ()) {
- _scheduler->join ();
+ if (_scheduler.joinable()) {
+ try {
+ _scheduler.join();
+ } catch (...) {
+
}
}
-
- delete _scheduler;
}
shared_ptr<Job>
JobManager::errors () const
{
boost::mutex::scoped_lock lm (_mutex);
- for (list<shared_ptr<Job> >::const_iterator i = _jobs.begin(); i != _jobs.end(); ++i) {
- if ((*i)->finished_in_error ()) {
+ BOOST_FOREACH (shared_ptr<Job> i, _jobs) {
+ if (i->finished_in_error ()) {
return true;
}
}
boost::mutex::scoped_lock lm (_mutex);
- optional<string> active_job;
-
while (true) {
bool have_new = false;
bool have_running = false;
BOOST_FOREACH (shared_ptr<Job> i, _jobs) {
if (i->running()) {
have_running = true;
- active_job = i->json_name();
}
if (i->is_new()) {
have_new = true;
if (i->is_new()) {
_connections.push_back (i->FinishedImmediate.connect(bind(&JobManager::job_finished, this)));
i->start ();
+ 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;
}
}
-
- lm.unlock ();
-
- if (active_job != _last_active_job) {
- emit (boost::bind (boost::ref (ActiveJobsChanged), _last_active_job, active_job));
- _last_active_job = active_job;
- }
}
}
void
JobManager::job_finished ()
{
+ {
+ boost::mutex::scoped_lock lm (_mutex);
+ emit (boost::bind (boost::ref (ActiveJobsChanged), _last_active_job, optional<string>()));
+ _last_active_job = optional<string>();
+ }
+
_empty_condition.notify_all ();
}
BOOST_FOREACH (shared_ptr<Job> i, _jobs) {
shared_ptr<AnalyseAudioJob> a = dynamic_pointer_cast<AnalyseAudioJob> (i);
- if (a && a->playlist () == playlist) {
+ if (a && a->path() == film->audio_analysis_path(playlist)) {
i->when_finished (connection, ready);
return;
}
job.reset (new AnalyseAudioJob (film, playlist, from_zero));
connection = job->Finished.connect (ready);
_jobs.push_back (job);
+ _empty_condition.notify_all ();
}
emit (boost::bind (boost::ref (JobAdded), weak_ptr<Job> (job)));