Can't put boost::thread in a std::list with our macOS compiler.
authorCarl Hetherington <cth@carlh.net>
Wed, 19 Feb 2020 20:55:04 +0000 (21:55 +0100)
committerCarl Hetherington <cth@carlh.net>
Wed, 19 Feb 2020 20:55:04 +0000 (21:55 +0100)
src/lib/j2k_encoder.cc
src/lib/j2k_encoder.h

index 96b5b86e78867b99d0cffc3414d1f458c7fac22c..ac420517f9ea27f9617d233ac300d98686e450c3 100644 (file)
@@ -250,7 +250,7 @@ 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 ();
@@ -263,6 +263,7 @@ J2KEncoder::terminate_threads ()
                }
                LOG_GENERAL_NC ("Thread terminated");
                ++n;
+               delete i;
        }
 
        _threads.clear ();
@@ -396,13 +397,14 @@ J2KEncoder::servers_list_changed ()
 
        if (!Config::instance()->only_servers_encode ()) {
                for (int i = 0; i < Config::instance()->master_encoding_threads (); ++i) {
-                       _threads.push_back (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 (_threads.back().native_handle(), "encode-worker");
+                       pthread_setname_np (t->native_handle(), "encode-worker");
 #endif
+                       _threads.push_back (t);
 #ifdef BOOST_THREAD_PLATFORM_WIN32
                        if (windows_xp) {
-                               SetThreadAffinityMask (_threads.back().native_handle(), 1 << i);
+                               SetThreadAffinityMask (t->native_handle(), 1 << i);
                        }
 #endif
                }
@@ -415,7 +417,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 (boost::thread(boost::bind(&J2KEncoder::encoder_thread, this, i)));
+                       _threads.push_back (new boost::thread(boost::bind(&J2KEncoder::encoder_thread, this, i)));
                }
        }
 
index b57c4df7e3692501a64256730ab2928b1a92a692..b4542c40a147cca4ccbc62b39f340a5f6a660afe 100644 (file)
@@ -89,7 +89,7 @@ private:
 
        /** Mutex for _threads */
        mutable boost::mutex _threads_mutex;
-       std::list<boost::thread> _threads;
+       std::list<boost::thread*> _threads;
        mutable boost::mutex _queue_mutex;
        std::list<boost::shared_ptr<DCPVideo> > _queue;
        /** condition to manage thread wakeups when we have nothing to do */