From 1ad2475f9e3c88b992f3fd3d6a77842287d3e4db Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Mon, 28 Oct 2013 10:09:04 +0100 Subject: DecoderControl: convert mutex and client_cond to a reference Share the Mutex between the DecoderThread and the PlayerThread. This simplifies synchronization between the two threads and fixes a freeze problem: while the PlayerThread waits for the DeocderThread, it cannot answer requests from the main thread, and the main thread will block until the DecoderThread finishes. --- src/DecoderControl.hxx | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) (limited to 'src/DecoderControl.hxx') diff --git a/src/DecoderControl.hxx b/src/DecoderControl.hxx index 4b3137108..23cb394ca 100644 --- a/src/DecoderControl.hxx +++ b/src/DecoderControl.hxx @@ -62,8 +62,13 @@ struct DecoderControl { /** * This lock protects #state and #command. + * + * This is usually a reference to PlayerControl::mutex, so + * that both player thread and decoder thread share a mutex. + * This simplifies synchronization with #cond and + * #client_cond. */ - mutable Mutex mutex; + Mutex &mutex; /** * Trigger this object after you have modified #command. This @@ -75,8 +80,10 @@ struct DecoderControl { /** * The trigger of this object's client. It is signalled * whenever an event occurs. + * + * This is usually a reference to PlayerControl::cond. */ - Cond client_cond; + Cond &client_cond; DecoderState state; DecoderCommand command; @@ -143,7 +150,11 @@ struct DecoderControl { MixRampInfo mix_ramp, previous_mix_ramp; - DecoderControl(); + /** + * @param _mutex see #mutex + * @param _client_cond see #client_cond + */ + DecoderControl(Mutex &_mutex, Cond &_client_cond); ~DecoderControl(); /** -- cgit v1.2.3