Extract common code out into kdm_for_screen()
[dcpomatic.git] / src / lib / j2k_encoder.cc
index 5c3fd477ef16dfeefb63d90bdb13bdbdd156bd0a..3d7b342da42d066958d643c9a64e4ea48a51b36d 100644 (file)
@@ -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:
@@ -250,25 +253,20 @@ J2KEncoder::terminate_threads ()
        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 ();
-               if (!(*i)->joinable()) {
-                       LOG_ERROR_NC ("About to join() a non-joinable thread");
-               }
+               i->interrupt ();
                try {
-                       (*i)->join ();
-               } catch (boost::thread_interrupted& e) {
-                       /* This is to be expected (I think?) */
+                       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 ();
@@ -402,7 +400,7 @@ 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<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
@@ -422,7 +420,7 @@ 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.push_back (new boost::thread(boost::bind(&J2KEncoder::encoder_thread, this, i)));
                }
        }