diff options
author | Max Kellermann <max@duempel.org> | 2010-11-04 21:30:16 +0100 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2010-11-04 23:44:23 +0100 |
commit | 8d5fa754e8e9a0de7b03413bb5433e1626368927 (patch) | |
tree | 2fdeeefd73b0a0a786a679cf527bbc3fab7ca566 | |
parent | 2ee047a1ddf2bb4d7e25a259492952c6128a749d (diff) | |
download | mpd-8d5fa754e8e9a0de7b03413bb5433e1626368927.tar.gz mpd-8d5fa754e8e9a0de7b03413bb5433e1626368927.tar.xz mpd-8d5fa754e8e9a0de7b03413bb5433e1626368927.zip |
output_thread: fix assertion failure due to race condition in OPEN
Change the assertion on "fail_timer==NULL" in OPEN to a runtime check.
This assertion crashed when the output thread failed while the player
thread was calling audio_output_open().
-rw-r--r-- | NEWS | 2 | ||||
-rw-r--r-- | src/output_thread.c | 10 |
2 files changed, 10 insertions, 2 deletions
@@ -1,5 +1,5 @@ ver 0.15.14 (2010/??/??) - +* output_thread: fix assertion failure due to race condition in OPEN ver 0.15.13 (2010/10/10) * output_thread: fix race condition after CANCEL command diff --git a/src/output_thread.c b/src/output_thread.c index b97694169..035cf99c1 100644 --- a/src/output_thread.c +++ b/src/output_thread.c @@ -197,10 +197,18 @@ static gpointer audio_output_task(gpointer arg) case AO_COMMAND_OPEN: assert(!ao->open); - assert(ao->fail_timer == NULL); assert(ao->pipe != NULL); assert(ao->chunk == NULL); + if (ao->fail_timer != NULL) { + /* this can only happen when this + output thread fails while + audio_output_open() is run in the + player thread */ + g_timer_destroy(ao->fail_timer); + ao->fail_timer = NULL; + } + error = NULL; ret = ao_plugin_open(ao->plugin, ao->data, &ao->out_audio_format, |