From 6f2e1c24151cd3734bd51673c5d2968e2c8bc1ae Mon Sep 17 00:00:00 2001
From: Max Kellermann <max@duempel.org>
Date: Wed, 27 Feb 2013 20:28:19 +0100
Subject: GlobalEvents: use g_idle_add() instead of WakeFD()

Use the GMainLoop specific function to wake up the main loop.  This is
simpler and comes with very little overhead.
---
 src/GlobalEvents.cxx | 33 +++++----------------------------
 1 file changed, 5 insertions(+), 28 deletions(-)

diff --git a/src/GlobalEvents.cxx b/src/GlobalEvents.cxx
index 202df39b6..20faa9a81 100644
--- a/src/GlobalEvents.cxx
+++ b/src/GlobalEvents.cxx
@@ -19,21 +19,16 @@
 
 #include "config.h"
 #include "GlobalEvents.hxx"
-#include "event/WakeFD.hxx"
-#include "mpd_error.h"
 
 #include <atomic>
 
 #include <assert.h>
 #include <glib.h>
-#include <string.h>
-#include <errno.h>
 
 #undef G_LOG_DOMAIN
 #define G_LOG_DOMAIN "global_events"
 
 namespace GlobalEvents {
-	static WakeFD wake_fd;
 	static guint source_id;
 	static std::atomic_uint flags;
 	static Handler handlers[MAX];
@@ -52,13 +47,8 @@ InvokeGlobalEvent(GlobalEvents::Event event)
 }
 
 static gboolean
-GlobalEventCallback(G_GNUC_UNUSED GIOChannel *source,
-		    G_GNUC_UNUSED GIOCondition condition,
-		    G_GNUC_UNUSED gpointer data)
+GlobalEventCallback(G_GNUC_UNUSED gpointer data)
 {
-	if (!GlobalEvents::wake_fd.Read())
-		return true;
-
 	const unsigned flags = GlobalEvents::flags.exchange(0);
 
 	for (unsigned i = 0; i < GlobalEvents::MAX; ++i)
@@ -66,32 +56,19 @@ GlobalEventCallback(G_GNUC_UNUSED GIOChannel *source,
 			/* invoke the event handler */
 			InvokeGlobalEvent(GlobalEvents::Event(i));
 
-	return true;
+	return false;
 }
 
 void
 GlobalEvents::Initialize()
 {
-	if (!wake_fd.Create())
-		MPD_ERROR("Couldn't open pipe: %s", strerror(errno));
-
-#ifndef G_OS_WIN32
-	GIOChannel *channel = g_io_channel_unix_new(wake_fd.Get());
-#else
-	GIOChannel *channel = g_io_channel_win32_new_socket(wake_fd.Get());
-#endif
-
-	source_id = g_io_add_watch(channel, G_IO_IN,
-				   GlobalEventCallback, NULL);
-	g_io_channel_unref(channel);
 }
 
 void
 GlobalEvents::Deinitialize()
 {
-	g_source_remove(source_id);
-
-	wake_fd.Destroy();
+	if (source_id != 0)
+		g_source_remove(source_id);
 }
 
 void
@@ -110,5 +87,5 @@ GlobalEvents::Emit(Event event)
 
 	const unsigned mask = 1u << unsigned(event);
 	if (GlobalEvents::flags.fetch_or(mask) == 0)
-		wake_fd.Write();
+		source_id = g_idle_add(GlobalEventCallback, nullptr);
 }
-- 
cgit v1.2.3