* @param o Options.
* @param l A log that we can write to.
*/
-Job::Job (shared_ptr<const FilmState> s, shared_ptr<const Options> o, Log* l)
+Job::Job (shared_ptr<const FilmState> s, shared_ptr<const Options> o, Log* l, shared_ptr<Job> req)
: _fs (s)
, _opt (o)
, _log (l)
+ , _required (req)
, _state (NEW)
, _start_time (0)
, _progress_unknown (false)
+ , _ran_for (0)
{
assert (_log);
set_progress (1);
set_state (FINISHED_ERROR);
- stringstream s;
- s << e.what() << "(" << filesystem::path (e.filename()).leaf() << ")";
- set_error (s.str ());
+ set_error (String::compose ("%1 (%2)", e.what(), filesystem::path (e.filename()).leaf()));
} catch (std::exception& e) {
}
}
+bool
+Job::is_new () const
+{
+ boost::mutex::scoped_lock lm (_state_mutex);
+ return _state == NEW;
+}
+
/** @return true if the job is running */
bool
Job::running () const
{
boost::mutex::scoped_lock lm (_state_mutex);
_state = s;
+
+ if (_state == FINISHED_OK || _state == FINISHED_ERROR) {
+ _ran_for = elapsed_time ();
+ }
}
/** A hack to work around our lack of cross-thread
_error = e;
}
-/** Set that this job's progress will always be unknown */
+/** Say that this job's progress will always be unknown */
void
Job::set_progress_unknown ()
{
_progress_unknown = true;
}
+/** @return Human-readable status of this job */
string
Job::status () const
{
} else if (!finished () && (t <= 10 || r == 0)) {
s << rint (p * 100) << "%";
} else if (finished_ok ()) {
- s << "OK (ran for " << seconds_to_hms (t) << ")";
+ s << "OK (ran for " << seconds_to_hms (_ran_for) << ")";
} else if (finished_in_error ()) {
s << "Error (" << error() << ")";
}
return s.str ();
}
+/** @return An estimate of the remaining time for this job, in seconds */
int
Job::remaining_time () const
{