aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2010-05-19 07:43:22 +0200
committerMax Kellermann <max@duempel.org>2010-05-19 11:37:39 +0200
commit8248f498b280f278f85a5bd6fad59245858f66cb (patch)
tree71f13f33097c22368d30ed6c1fe9821d9ec1f371
parent22f3ffb0997be4953888d0e5c61fc66256aeef5b (diff)
downloadmpd-8248f498b280f278f85a5bd6fad59245858f66cb.tar.gz
mpd-8248f498b280f278f85a5bd6fad59245858f66cb.tar.xz
mpd-8248f498b280f278f85a5bd6fad59245858f66cb.zip
event_pipe: use g_io_channel_read_chars() to drain the pipe
For some unknown reason, read() blocks on WIN32, even though it was invoked inside the G_IO_IN callback. By switching to GIOChannel functions, this problem is solved, and it works on both Linux and Windows.
-rw-r--r--src/event_pipe.c20
1 files changed, 14 insertions, 6 deletions
diff --git a/src/event_pipe.c b/src/event_pipe.c
index 5f69ee95c..af6517cd4 100644
--- a/src/event_pipe.c
+++ b/src/event_pipe.c
@@ -38,6 +38,7 @@
#define G_LOG_DOMAIN "event_pipe"
static int event_pipe[2];
+static GIOChannel *event_channel;
static guint event_pipe_source_id;
static GMutex *event_pipe_mutex;
static bool pipe_events[PIPE_EVENT_MAX];
@@ -61,12 +62,15 @@ main_notify_event(G_GNUC_UNUSED GIOChannel *source,
G_GNUC_UNUSED gpointer data)
{
char buffer[256];
- ssize_t r = read(event_pipe[0], buffer, sizeof(buffer));
- bool events[PIPE_EVENT_MAX];
-
- if (r < 0 && errno != EAGAIN && errno != EINTR)
- g_error("error reading from pipe: %s", strerror(errno));
+ gsize bytes_read;
+ GError *error = NULL;
+ GIOStatus status = g_io_channel_read_chars(event_channel,
+ buffer, sizeof(buffer),
+ &bytes_read, &error);
+ if (status == G_IO_STATUS_ERROR)
+ g_error("error reading from pipe: %s", error->message);
+ bool events[PIPE_EVENT_MAX];
g_mutex_lock(event_pipe_mutex);
memcpy(events, pipe_events, sizeof(events));
memset(pipe_events, 0, sizeof(pipe_events));
@@ -94,10 +98,13 @@ void event_pipe_init(void)
#else
channel = g_io_channel_win32_new_fd(event_pipe[0]);
#endif
+ g_io_channel_set_encoding(channel, NULL, NULL);
+ g_io_channel_set_buffered(channel, false);
event_pipe_source_id = g_io_add_watch(channel, G_IO_IN,
main_notify_event, NULL);
- g_io_channel_unref(channel);
+
+ event_channel = channel;
event_pipe_mutex = g_mutex_new();
}
@@ -107,6 +114,7 @@ void event_pipe_deinit(void)
g_mutex_free(event_pipe_mutex);
g_source_remove(event_pipe_source_id);
+ g_io_channel_unref(event_channel);
close(event_pipe[0]);
close(event_pipe[1]);