Throw exceptions when things in the butler get really out of hand.
[dcpomatic.git] / src / lib / butler.cc
index 623a17c2fdb13829fb166ac12b2e1838778778cf..223f8d579b34cc4ffbc0b713191009c2039c6f9e 100644 (file)
@@ -23,6 +23,7 @@
 #include "util.h"
 #include "log.h"
 #include "compose.hpp"
+#include "exceptions.h"
 #include <boost/weak_ptr.hpp>
 #include <boost/shared_ptr.hpp>
 
@@ -61,6 +62,9 @@ Butler::Butler (shared_ptr<Player> player, shared_ptr<Log> log, AudioMapping aud
        _player_video_connection = _player->Video.connect (bind (&Butler::video, this, _1, _2));
        _player_audio_connection = _player->Audio.connect (bind (&Butler::audio, this, _1));
        _thread = new boost::thread (bind (&Butler::thread, this));
+#ifdef DCPOMATIC_LINUX
+       pthread_setname_np (_thread->native_handle(), "butler");
+#endif
 
        /* Create some threads to do work on the PlayerVideos we are creating; at present this is used to
           multi-thread JPEG2000 decoding.
@@ -94,6 +98,18 @@ Butler::~Butler ()
 bool
 Butler::should_run () const
 {
+       if (_video.size() >= MAXIMUM_VIDEO_READAHEAD * 10) {
+               /* This is way too big */
+               throw ProgrammingError
+                       (__FILE__, __LINE__, String::compose ("Butler video buffers reached %1 frames (audio is %2)", _video.size(), _audio.size()));
+       }
+
+       if (_audio.size() >= MAXIMUM_AUDIO_READAHEAD * 10) {
+               /* This is way too big */
+               throw ProgrammingError
+                       (__FILE__, __LINE__, String::compose ("Butler audio buffers reached %1 frames (video is %2)", _audio.size(), _video.size()));
+       }
+
        if (_video.size() >= MAXIMUM_VIDEO_READAHEAD * 2) {
                LOG_WARNING ("Butler video buffers reached %1 frames (audio is %2)", _video.size(), _audio.size());
        }
@@ -211,12 +227,10 @@ Butler::prepare (weak_ptr<PlayerVideo> weak_video) const
 void
 Butler::video (shared_ptr<PlayerVideo> video, DCPTime time)
 {
-       {
-               boost::mutex::scoped_lock lm (_mutex);
-               if (_pending_seek_position) {
-                       /* Don't store any video while a seek is pending */
-                       return;
-               }
+       boost::mutex::scoped_lock lm (_mutex);
+       if (_pending_seek_position) {
+               /* Don't store any video while a seek is pending */
+               return;
        }
 
        _prepare_service.post (bind (&Butler::prepare, this, weak_ptr<PlayerVideo>(video)));