diff options
| author | Carl Hetherington <cth@carlh.net> | 2015-09-02 17:03:50 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2015-09-02 17:03:50 +0100 |
| commit | b010bf3a39efe65db2251fbbf2640b2d9e539200 (patch) | |
| tree | 61ac0f5144e0f4dd6c8a19e8101271ca09b76e9c /src/lib/encoder.cc | |
| parent | 73d54683d5e034b56e2edca968b477bb1b3a9603 (diff) | |
Don't share _terminate.
_terminate was being shared between enqueue() and the encoding
threads so that when terminating and recreating the encoding
threads any pending enqueue() was dropped (#683).
Diffstat (limited to 'src/lib/encoder.cc')
| -rw-r--r-- | src/lib/encoder.cc | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/src/lib/encoder.cc b/src/lib/encoder.cc index 00e28e1eb..06fc81ad7 100644 --- a/src/lib/encoder.cc +++ b/src/lib/encoder.cc @@ -61,7 +61,8 @@ Encoder::Encoder (shared_ptr<const Film> film, weak_ptr<Job> j, shared_ptr<Write , _video_frames_enqueued (0) , _left_done (false) , _right_done (false) - , _terminate (false) + , _terminate_enqueue (false) + , _terminate_encoding (false) , _writer (writer) { servers_list_changed (); @@ -70,6 +71,11 @@ Encoder::Encoder (shared_ptr<const Film> film, weak_ptr<Job> j, shared_ptr<Write Encoder::~Encoder () { terminate_threads (); + + boost::mutex::scoped_lock lm (_queue_mutex); + _terminate_enqueue = true; + _full_condition.notify_all (); + _empty_condition.notify_all (); } void @@ -183,13 +189,13 @@ Encoder::enqueue (shared_ptr<PlayerVideo> pv) /* XXX: discard 3D here if required */ /* Wait until the queue has gone down a bit */ - while (_queue.size() >= threads * 2 && !_terminate) { + while (_queue.size() >= threads * 2 && !_terminate_enqueue) { LOG_TIMING ("decoder-sleep queue=%1", _queue.size()); _full_condition.wait (queue_lock); LOG_TIMING ("decoder-wake queue=%1", _queue.size()); } - if (_terminate) { + if (_terminate_enqueue) { return; } @@ -256,7 +262,7 @@ Encoder::terminate_threads () { { boost::mutex::scoped_lock queue_lock (_queue_mutex); - _terminate = true; + _terminate_encoding = true; _full_condition.notify_all (); _empty_condition.notify_all (); } @@ -271,7 +277,7 @@ Encoder::terminate_threads () } _threads.clear (); - _terminate = false; + _terminate_encoding = false; } void @@ -294,11 +300,11 @@ try LOG_TIMING ("encoder-sleep thread=%1", boost::this_thread::get_id()); boost::mutex::scoped_lock lock (_queue_mutex); - while (_queue.empty () && !_terminate) { + while (_queue.empty () && !_terminate_encoding) { _empty_condition.wait (lock); } - if (_terminate) { + if (_terminate_encoding) { return; } |
