Do tidy up on disconnection.
authorColin Guthrie <pulse@colin.guthr.ie>
Sun, 11 May 2008 17:02:19 +0000 (17:02 +0000)
committerColin Guthrie <pulse@colin.guthr.ie>
Wed, 8 Oct 2008 19:32:08 +0000 (20:32 +0100)
Only clear IO related stuff if this free() was triggered deliberatly (i.e. not by server side disconnect)

git-svn-id: file:///home/lennart/svn/public/pulseaudio/branches/coling@2411 fefdeb5f-60dc-0310-8127-8f9354f1896f

src/modules/rtp/raop_client.c
src/modules/rtp/rtsp_client.c

index a9b9ab1..e5a373d 100644 (file)
@@ -344,6 +344,7 @@ static void rtsp_cb(pa_rtsp_client *rtsp, pa_rtsp_state state, pa_headerlist* he
         case STATE_DISCONNECTED:
             pa_assert(c->closed_callback);
             pa_log_debug("RTSP channel closed");
+            c->rtsp = NULL;
             if (c->fd > 0) {
                 pa_close(c->fd);
                 c->fd = -1;
@@ -400,7 +401,8 @@ void pa_raop_client_free(pa_raop_client* c)
     pa_assert(c);
 
     pa_xfree(c->buffer);
-    pa_rtsp_client_free(c->rtsp);
+    if (c->rtsp)
+        pa_rtsp_client_free(c->rtsp);
     pa_xfree(c->host);
     pa_xfree(c);
 }
index 2483972..f9fe9bf 100644 (file)
@@ -151,6 +151,10 @@ void pa_rtsp_client_free(pa_rtsp_client* c) {
     if (c) {
         if (c->sc)
             pa_socket_client_unref(c->sc);
+        if (c->ioline)
+            pa_ioline_close(c->ioline);
+        else if (c->io)
+            pa_iochannel_free(c->io);
 
         pa_xfree(c->url);
         pa_xfree(c->localip);
@@ -227,6 +231,10 @@ static void line_callback(pa_ioline *line, const char *s, void *userdata) {
     pa_assert(c->callback);
 
     if (!s) {
+        /* Keep the ioline/iochannel open as they will be freed automatically */
+        c->ioline = NULL;
+        c->io = NULL;
+        pa_rtsp_client_free(c);
         c->callback(c, STATE_DISCONNECTED, NULL, c->userdata);
         return;
     }