From dc76eb613903df20abfec08c36f5571db96959ca Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Thu, 31 Dec 2015 12:42:02 +0100 Subject: [PATCH] decoder/Thread: mutex not locked for decoder_run_{file,stream}() --- src/decoder/DecoderThread.cxx | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/src/decoder/DecoderThread.cxx b/src/decoder/DecoderThread.cxx index 11efa654f..90576bc9c 100644 --- a/src/decoder/DecoderThread.cxx +++ b/src/decoder/DecoderThread.cxx @@ -269,20 +269,16 @@ decoder_run_stream_fallback(Decoder &decoder, InputStream &is) /** * Try decoding a stream. * - * Caller holds DecoderControl::mutex. + * DecoderControl::mutex is not locked by caller. */ static bool decoder_run_stream(Decoder &decoder, const char *uri) { DecoderControl &dc = decoder.dc; - dc.Unlock(); - InputStream *input_stream = decoder_input_stream_open(dc, uri); - if (input_stream == nullptr) { - dc.Lock(); + if (input_stream == nullptr) return false; - } dc.Lock(); @@ -297,7 +293,6 @@ decoder_run_stream(Decoder &decoder, const char *uri) dc.Unlock(); delete input_stream; - dc.Lock(); return success; } @@ -363,7 +358,7 @@ TryDecoderFile(Decoder &decoder, Path path_fs, const char *suffix, /** * Try decoding a file. * - * Caller holds DecoderControl::mutex. + * DecoderControl::mutex is not locked by caller. */ static bool decoder_run_file(Decoder &decoder, const char *uri_utf8, Path path_fs) @@ -373,7 +368,6 @@ decoder_run_file(Decoder &decoder, const char *uri_utf8, Path path_fs) return false; DecoderControl &dc = decoder.dc; - dc.Unlock(); decoder_load_replay_gain(decoder, path_fs); @@ -382,10 +376,11 @@ decoder_run_file(Decoder &decoder, const char *uri_utf8, Path path_fs) return TryDecoderFile(decoder, path_fs, suffix, plugin); - })) + })) { + dc.Unlock(); return true; + } - dc.Lock(); return false; } @@ -409,12 +404,12 @@ decoder_run_song(DecoderControl &dc, decoder_command_finished_locked(dc); + dc.Unlock(); + const int ret = !path_fs.IsNull() ? decoder_run_file(decoder, uri, path_fs) : decoder_run_stream(decoder, uri); - dc.Unlock(); - /* flush the last chunk */ if (decoder.chunk != nullptr)