Don't start thread in constructor; tidy up thread in destructor (UpdateChecker).
authorCarl Hetherington <cth@carlh.net>
Tue, 1 Sep 2015 19:56:58 +0000 (20:56 +0100)
committerCarl Hetherington <cth@carlh.net>
Tue, 1 Sep 2015 19:56:58 +0000 (20:56 +0100)
src/lib/update_checker.cc
src/lib/update_checker.h

index 634328e6aef992c0bee26d0f170657484415d9a6..52dfce7f782ce38ef8405f73fdf8337c90c94daa 100644 (file)
@@ -55,7 +55,9 @@ UpdateChecker::UpdateChecker ()
        , _curl (0)
        , _state (NOT_RUN)
        , _emits (0)
+       , _thread (0)
        , _to_do (0)
+       , _terminate (false)
 {
        _curl = curl_easy_init ();
 
@@ -66,13 +68,26 @@ UpdateChecker::UpdateChecker ()
 
        string const agent = "dcpomatic/" + string (dcpomatic_version);
        curl_easy_setopt (_curl, CURLOPT_USERAGENT, agent.c_str ());
+}
 
+void
+UpdateChecker::start ()
+{
        _thread = new boost::thread (boost::bind (&UpdateChecker::thread, this));
 }
 
 UpdateChecker::~UpdateChecker ()
 {
-       /* We are not cleaning up our thread, but hey well */
+       {
+               boost::mutex::scoped_lock lm (_process_mutex);
+               _terminate = true;
+       }
+
+       _condition.notify_all ();
+       if (_thread) {
+               _thread->join ();
+       }
+       delete _thread;
 
        curl_easy_cleanup (_curl);
        delete[] _buffer;
@@ -93,9 +108,14 @@ UpdateChecker::thread ()
        while (true) {
                /* Block until there is something to do */
                boost::mutex::scoped_lock lock (_process_mutex);
-               while (_to_do == 0) {
+               while (_to_do == 0 && !_terminate) {
                        _condition.wait (lock);
                }
+
+               if (_terminate) {
+                       return;
+               }
+
                --_to_do;
                lock.unlock ();
 
@@ -173,6 +193,7 @@ UpdateChecker::instance ()
 {
        if (!_instance) {
                _instance = new UpdateChecker ();
+               _instance->start ();
        }
 
        return _instance;
index b82be7808f7fa0c957a98c02a7ad69a3685e8b5d..b0eb62273719ecab4bda6231066ac982ae3863ee 100644 (file)
@@ -34,7 +34,6 @@ struct update_checker_test;
 class UpdateChecker : public Signaller, public boost::noncopyable
 {
 public:
-       UpdateChecker ();
        ~UpdateChecker ();
 
        void run ();
@@ -83,6 +82,8 @@ private:
 
        static bool version_less_than (std::string const & a, std::string const & b);
 
+       UpdateChecker ();
+       void start ();
        void set_state (State);
        void thread ();
 
@@ -101,4 +102,5 @@ private:
        boost::mutex _process_mutex;
        boost::condition _condition;
        int _to_do;
+       bool _terminate;
 };