From 64dacd175ac7279b4b019c2e653d85007d71efb0 Mon Sep 17 00:00:00 2001
From: Max Kellermann <max@duempel.org>
Date: Thu, 19 Aug 2010 11:05:24 +0200
Subject: [PATCH] output_thread: fix race condition after CANCEL command

Clear the notification before finishing the CANCEL command, so the
notify_wait() after that will always wait for the right notification,
sent by audio_output_all_cancel().
---
 NEWS                |  1 +
 src/output_thread.c | 10 ++++++++++
 2 files changed, 11 insertions(+)

diff --git a/NEWS b/NEWS
index c8f63f4de..566422cfe 100644
--- a/NEWS
+++ b/NEWS
@@ -1,4 +1,5 @@
 ver 0.15.13 (2010/??/??)
+* output_thread: fix race condition after CANCEL command
 
 
 ver 0.15.12 (2010/07/20)
diff --git a/src/output_thread.c b/src/output_thread.c
index 770b377e8..e652eae57 100644
--- a/src/output_thread.c
+++ b/src/output_thread.c
@@ -268,6 +268,16 @@ static gpointer audio_output_task(gpointer arg)
 			ao->chunk = NULL;
 			if (ao->open)
 				ao_plugin_cancel(ao->plugin, ao->data);
+
+			/* we must clear the notification now, because
+			   the notify_wait() call below must wait
+			   until audio_output_all_cancel() has cleared
+			   the pipe; if another notification happens
+			   to be still pending, we get a race
+			   condition with a crash or an assertion
+			   failure */
+			notify_clear(&ao->notify);
+
 			ao_command_finished(ao);
 
 			/* the player thread will now clear our music