From 7e0cdbe502f4f05fccf773ff3d1782c905a3ad27 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Wed, 30 Dec 2015 06:16:30 +0100 Subject: [PATCH] decoder/Thread: use ScopeUnlock for exception-safety --- src/decoder/DecoderThread.cxx | 43 ++++++++++++++++++----------------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/src/decoder/DecoderThread.cxx b/src/decoder/DecoderThread.cxx index 3bed1339c..394ad5ecb 100644 --- a/src/decoder/DecoderThread.cxx +++ b/src/decoder/DecoderThread.cxx @@ -144,15 +144,15 @@ decoder_stream_decode(const DecoderPlugin &plugin, /* rewind the stream, so each plugin gets a fresh start */ input_stream.Rewind(IgnoreError()); - decoder.dc.Unlock(); + { + const ScopeUnlock unlock(decoder.dc.mutex); - FormatThreadName("decoder:%s", plugin.name); + FormatThreadName("decoder:%s", plugin.name); - plugin.StreamDecode(decoder, input_stream); + plugin.StreamDecode(decoder, input_stream); - SetThreadName("decoder"); - - decoder.dc.Lock(); + SetThreadName("decoder"); + } assert(decoder.dc.state == DecoderState::START || decoder.dc.state == DecoderState::DECODE); @@ -181,15 +181,15 @@ decoder_file_decode(const DecoderPlugin &plugin, if (decoder.dc.command == DecoderCommand::STOP) return true; - decoder.dc.Unlock(); + { + const ScopeUnlock unlock(decoder.dc.mutex); - FormatThreadName("decoder:%s", plugin.name); + FormatThreadName("decoder:%s", plugin.name); - plugin.FileDecode(decoder, path); + plugin.FileDecode(decoder, path); - SetThreadName("decoder"); - - decoder.dc.Lock(); + SetThreadName("decoder"); + } assert(decoder.dc.state == DecoderState::START || decoder.dc.state == DecoderState::DECODE); @@ -389,18 +389,19 @@ decoder_run_song(DecoderControl &dc, decoder_command_finished_locked(dc); - dc.Unlock(); + int ret; + { + const ScopeUnlock unlock(dc.mutex); - const int ret = !path_fs.IsNull() - ? decoder_run_file(decoder, uri, path_fs) - : decoder_run_stream(decoder, uri); + ret = !path_fs.IsNull() + ? decoder_run_file(decoder, uri, path_fs) + : decoder_run_stream(decoder, uri); - /* flush the last chunk */ + /* flush the last chunk */ - if (decoder.chunk != nullptr) - decoder.FlushChunk(); - - dc.Lock(); + if (decoder.chunk != nullptr) + decoder.FlushChunk(); + } if (decoder.error.IsDefined()) { /* copy the Error from sruct Decoder to