From 29e1b6e4653b4ab65b9fe5326b1df8fe7cb6a1d2 Mon Sep 17 00:00:00 2001
From: Max Kellermann <max@musicpd.org>
Date: Thu, 9 Feb 2017 20:57:14 +0100
Subject: [PATCH] mixer/alsa: reset the MultiSocketMonitor in the destructor

Fixes potential crash bug.
---
 NEWS                                  | 2 ++
 src/mixer/plugins/AlsaMixerPlugin.cxx | 7 +++++++
 2 files changed, 9 insertions(+)

diff --git a/NEWS b/NEWS
index 7ba59b10a..1fcae0d6d 100644
--- a/NEWS
+++ b/NEWS
@@ -3,6 +3,8 @@ ver 0.20.5 (not yet released)
   - id3: fix memory leak on corrupt ID3 tags
 * decoder
   - sidplay: don't require libsidutils when building with libsidplayfp
+* mixer
+  - alsa: fix crash bug
 
 ver 0.20.4 (2017/02/01)
 * input
diff --git a/src/mixer/plugins/AlsaMixerPlugin.cxx b/src/mixer/plugins/AlsaMixerPlugin.cxx
index 4f0e329a8..852326926 100644
--- a/src/mixer/plugins/AlsaMixerPlugin.cxx
+++ b/src/mixer/plugins/AlsaMixerPlugin.cxx
@@ -23,6 +23,7 @@
 #include "output/OutputAPI.hxx"
 #include "event/MultiSocketMonitor.hxx"
 #include "event/DeferredMonitor.hxx"
+#include "event/Call.hxx"
 #include "util/ASCII.hxx"
 #include "util/ReusableArray.hxx"
 #include "util/Domain.hxx"
@@ -53,6 +54,12 @@ public:
 		DeferredMonitor::Schedule();
 	}
 
+	~AlsaMixerMonitor() {
+		BlockingCall(MultiSocketMonitor::GetEventLoop(), [this](){
+				MultiSocketMonitor::Reset();
+			});
+	}
+
 private:
 	virtual void RunDeferred() override {
 		InvalidateSockets();