Comment and slightly tidy ExceptionStore.
authorCarl Hetherington <cth@carlh.net>
Mon, 30 Dec 2013 21:46:10 +0000 (21:46 +0000)
committerCarl Hetherington <cth@carlh.net>
Mon, 30 Dec 2013 21:46:10 +0000 (21:46 +0000)
src/lib/encoder.cc
src/lib/exceptions.h
src/lib/writer.cc

index eff38b6a57840ddbd3a3e3dcc9194f440f5503af..ca75e4ca1caa7a0c93088f5e2470e3990755a92f 100644 (file)
@@ -199,9 +199,7 @@ Encoder::process_video (shared_ptr<PlayerImage> image, Eyes eyes, ColourConversi
                return;
        }
 
-       if (_writer->thrown ()) {
-               _writer->rethrow ();
-       }
+       _writer->rethrow ();
 
        if (_writer->can_fake_write (_video_frames_out)) {
                _writer->fake_write (_video_frames_out, eyes);
index f4631c09b67310bcf75492daca3b2b58dfd5e835..c1240538f3de2e2a10b6dfb052e17d2bbbbffc9e 100644 (file)
@@ -230,17 +230,30 @@ public:
        PixelFormatError (std::string o, AVPixelFormat f);
 };
 
+/** A parent class for classes which have a need to catch and
+ *  re-throw exceptions.  This is intended for classes
+ *  which run their own thread; they should do something like
+ *
+ *  void my_thread ()
+ *  try {
+ *    // do things which might throw exceptions
+ *  } catch (...) {
+ *    store_current ();
+ *  }
+ *
+ *  and then in another thread call rethrow().  If any
+ *  exception was thrown by my_thread it will be stored by
+ *  store_current() and then rethrow() will re-throw it where
+ *  it can be handled.
+ */
 class ExceptionStore
 {
 public:
-       bool thrown () const {
-               boost::mutex::scoped_lock lm (_mutex);
-               return _exception;
-       }
-       
        void rethrow () {
                boost::mutex::scoped_lock lm (_mutex);
-               boost::rethrow_exception (_exception);
+               if (_exception) {
+                       boost::rethrow_exception (_exception);
+               }
        }
 
 protected:     
index 4129b7a824455ffc8138cf0a8a6e0ccc638920b9..414ea72ebb47425e55e9d4719e9819c453985b16 100644 (file)
@@ -335,9 +335,7 @@ Writer::finish ()
        lock.unlock ();
 
        _thread->join ();
-       if (thrown ()) {
-               rethrow ();
-       }
+       rethrow ();
        
        delete _thread;
        _thread = 0;