Code

gidle: mpd_glib_enter() returns success
authorMax Kellermann <max@duempel.org>
Fri, 16 Oct 2009 13:08:51 +0000 (15:08 +0200)
committerMax Kellermann <max@duempel.org>
Fri, 16 Oct 2009 13:08:51 +0000 (15:08 +0200)
mpd_glib_enter() is unreliable, because it does nothing when called
during the callback, which in turn was invoked by mpd_glib_leave().
Sometimes, mpdclient.idle is wrong because of that.  This patch sets
mpdclient.idle to the return value of mpd_glib_enter().

src/gidle.c
src/gidle.h
src/mpdclient.c

index d4fd8074351806ea56f7827e43848e1146097589..2165294723aa242c8d43f448e40bd42f985efc7e 100644 (file)
@@ -337,7 +337,7 @@ mpd_glib_add_watch(struct mpd_glib_source *source)
        source->io_events = events;
 }
 
-void
+bool
 mpd_glib_enter(struct mpd_glib_source *source)
 {
        bool success;
@@ -347,17 +347,18 @@ mpd_glib_enter(struct mpd_glib_source *source)
        assert(!source->destroyed);
 
        if (source->leaving)
-               return;
+               return false;
 
        source->idle_events = 0;
 
        success = mpd_async_send_command(source->async, "idle", NULL);
        if (!success) {
                mpd_glib_invoke_async_error(source);
-               return;
+               return false;
        }
 
        mpd_glib_add_watch(source);
+       return true;
 }
 
 bool
index 6d17f76191b155f7073ac944a28a178fb36d7a97..240411612f1548eac560153db335f2866ef8308b 100644 (file)
@@ -45,7 +45,13 @@ mpd_glib_new(struct mpd_connection *connection,
 void
 mpd_glib_free(struct mpd_glib_source *source);
 
-void
+/**
+ * Enters idle mode.
+ *
+ * @return true if idle mode has been entered, false if not
+ * (e.g. blocked during the callback, or I/O error)
+ */
+bool
 mpd_glib_enter(struct mpd_glib_source *source);
 
 /**
index e380ac0dc8cae56102e4e5fb1fe680a7bcf97ef8..748baed5c1e99d42470254ea39240dcf3ff09753 100644 (file)
@@ -252,8 +252,7 @@ mpdclient_put_connection(struct mpdclient *c)
        assert(c->source == NULL || c->connection != NULL);
 
        if (c->source != NULL && !c->idle) {
-               c->idle = true;
-               mpd_glib_enter(c->source);
+               c->idle = mpd_glib_enter(c->source);
        }
 }