/*
- Copyright (C) 2012-2015 Carl Hetherington <cth@carlh.net>
+ Copyright (C) 2012-2019 Carl Hetherington <cth@carlh.net>
This file is part of DCP-o-matic.
using std::list;
using std::cout;
+using std::exception;
using boost::shared_ptr;
using boost::weak_ptr;
using boost::optional;
terminate_threads ();
+ /* Something might have been thrown during terminate_threads */
+ rethrow ();
+
LOG_GENERAL (N_("Mopping up %1"), _queue.size());
/* The following sequence of events can occur in the above code:
}
/** @return an estimate of the current number of frames we are encoding per second,
- * or 0 if not known.
+ * if known.
*/
-float
+optional<float>
J2KEncoder::current_encoding_rate () const
{
return _history.rate ();
boost::mutex::scoped_lock threads_lock (_threads_mutex);
int n = 0;
- for (list<boost::thread *>::iterator i = _threads.begin(); i != _threads.end(); ++i) {
+ BOOST_FOREACH (boost::thread* i, _threads) {
+ /* Be careful not to throw in here otherwise _threads will not be clear()ed */
LOG_GENERAL ("Terminating thread %1 of %2", n + 1, _threads.size ());
- (*i)->interrupt ();
- DCPOMATIC_ASSERT ((*i)->joinable ());
+ i->interrupt ();
try {
- (*i)->join ();
- } catch (boost::thread_interrupted& e) {
- /* This is to be expected */
+ i->join ();
+ } catch (exception& e) {
+ LOG_ERROR ("join() threw an exception: %1", e.what());
+ } catch (...) {
+ LOG_ERROR_NC ("join() threw an exception");
}
- delete *i;
LOG_GENERAL_NC ("Thread terminated");
++n;
+ delete i;
}
_threads.clear ();
if (!Config::instance()->only_servers_encode ()) {
for (int i = 0; i < Config::instance()->master_encoding_threads (); ++i) {
- boost::thread* t = new boost::thread (boost::bind (&J2KEncoder::encoder_thread, this, optional<EncodeServerDescription> ()));
+ boost::thread* t = new boost::thread (boost::bind(&J2KEncoder::encoder_thread, this, optional<EncodeServerDescription>()));
#ifdef DCPOMATIC_LINUX
pthread_setname_np (t->native_handle(), "encode-worker");
#endif
LOG_GENERAL (N_("Adding %1 worker threads for remote %2"), i.threads(), i.host_name ());
for (int j = 0; j < i.threads(); ++j) {
- _threads.push_back (new boost::thread (boost::bind (&J2KEncoder::encoder_thread, this, i)));
+ _threads.push_back (new boost::thread(boost::bind(&J2KEncoder::encoder_thread, this, i)));
}
}