X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fj2k_encoder.cc;h=d8d8209c91145f78f2039f84ec1f9fb009df0a5c;hb=6eba051dcbb8c56e3e2efea946ce0380d17a7b33;hp=ac420517f9ea27f9617d233ac300d98686e450c3;hpb=5b1b70c86df7225a2a102bdde3b38ea591a6dcbb;p=dcpomatic.git diff --git a/src/lib/j2k_encoder.cc b/src/lib/j2k_encoder.cc index ac420517f..d8d8209c9 100644 --- a/src/lib/j2k_encoder.cc +++ b/src/lib/j2k_encoder.cc @@ -116,6 +116,9 @@ J2KEncoder::end () 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: @@ -182,11 +185,7 @@ J2KEncoder::encode (shared_ptr pv, DCPTime time) { _waker.nudge (); - size_t threads = 0; - { - boost::mutex::scoped_lock threads_lock (_threads_mutex); - threads = _threads.size (); - } + size_t threads = _threads->size(); boost::mutex::scoped_lock queue_lock (_queue_mutex); @@ -247,26 +246,20 @@ J2KEncoder::encode (shared_ptr pv, DCPTime time) void J2KEncoder::terminate_threads () { - boost::mutex::scoped_lock threads_lock (_threads_mutex); + if (!_threads) { + return; + } - int n = 0; - 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 (); - try { - i->join (); - } catch (exception& e) { - LOG_ERROR ("join() threw an exception: %1", e.what()); - } catch (...) { - LOG_ERROR_NC ("join() threw an exception"); - } - LOG_GENERAL_NC ("Thread terminated"); - ++n; - delete i; + _threads->interrupt_all (); + try { + _threads->join_all (); + } catch (exception& e) { + LOG_ERROR ("join() threw an exception: %1", e.what()); + } catch (...) { + LOG_ERROR_NC ("join() threw an exception"); } - _threads.clear (); + _threads.reset (); } void @@ -380,11 +373,10 @@ void J2KEncoder::servers_list_changed () { terminate_threads (); + _threads.reset (new boost::thread_group()); /* XXX: could re-use threads */ - boost::mutex::scoped_lock lm (_threads_mutex); - #ifdef BOOST_THREAD_PLATFORM_WIN32 OSVERSIONINFO info; info.dwOSVersionInfoSize = sizeof (OSVERSIONINFO); @@ -397,12 +389,15 @@ J2KEncoder::servers_list_changed () 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())); #ifdef DCPOMATIC_LINUX + boost::thread* t = _threads->create_thread(boost::bind(&J2KEncoder::encoder_thread, this, optional())); pthread_setname_np (t->native_handle(), "encode-worker"); #endif - _threads.push_back (t); -#ifdef BOOST_THREAD_PLATFORM_WIN32 +#ifdef DCPOMATIC_OSX + _threads->create_thread(boost::bind(&J2KEncoder::encoder_thread, this, optional())); +#endif +#ifdef DCPOMATIC_WINDOWS + boost::thread* t = _threads->create_thread(boost::bind(&J2KEncoder::encoder_thread, this, optional())); if (windows_xp) { SetThreadAffinityMask (t->native_handle(), 1 << i); } @@ -417,9 +412,9 @@ J2KEncoder::servers_list_changed () 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->create_thread(boost::bind(&J2KEncoder::encoder_thread, this, i)); } } - _writer->set_encoder_threads (_threads.size ()); + _writer->set_encoder_threads (_threads->size()); }