summaryrefslogtreecommitdiff
path: root/src/lib/encoder.cc
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2015-09-02 17:03:50 +0100
committerCarl Hetherington <cth@carlh.net>2015-09-02 17:03:50 +0100
commitb010bf3a39efe65db2251fbbf2640b2d9e539200 (patch)
tree61ac0f5144e0f4dd6c8a19e8101271ca09b76e9c /src/lib/encoder.cc
parent73d54683d5e034b56e2edca968b477bb1b3a9603 (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.cc20
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;
}