multihandlesink: fix one bug in multisocketsink refactoring
authorThomas Vander Stichele <thomas (at) apestaart (dot) org>
Thu, 26 Jan 2012 18:34:47 +0000 (19:34 +0100)
committerThomas Vander Stichele <thomas (at) apestaart (dot) org>
Sun, 12 Feb 2012 21:10:51 +0000 (22:10 +0100)
gst/tcp/gstmultifdsink.c
gst/tcp/gstmultisocketsink.c
tests/check/elements/multisocketsink.c

index 1f4dd15c2a4e2a365e878bf169c7e560aa48fbd4..5257d4e3d4c2a711d06afe5d469b81dfd98668a7 100644 (file)
@@ -855,6 +855,8 @@ restart:
     next = g_list_next (clients);
 
     mhclient->status = GST_CLIENT_STATUS_REMOVED;
     next = g_list_next (clients);
 
     mhclient->status = GST_CLIENT_STATUS_REMOVED;
+    /* the next call changes the list, which is why we iterate
+     * with a temporary next pointer */
     gst_multi_fd_sink_remove_client_link (sink, clients);
   }
   gst_poll_restart (sink->fdset);
     gst_multi_fd_sink_remove_client_link (sink, clients);
   }
   gst_poll_restart (sink->fdset);
index b01575db7c3fe6f0b9c67f837291d1abf289f9e2..44f62c61b0105236cbac589febfa2c283447243e 100644 (file)
@@ -782,7 +782,7 @@ done:
 void
 gst_multi_socket_sink_clear (GstMultiHandleSink * mhsink)
 {
 void
 gst_multi_socket_sink_clear (GstMultiHandleSink * mhsink)
 {
-  GList *clients;
+  GList *clients, *next;
   guint32 cookie;
   GstMultiSocketSink *sink = GST_MULTI_SOCKET_SINK (mhsink);
 
   guint32 cookie;
   GstMultiSocketSink *sink = GST_MULTI_SOCKET_SINK (mhsink);
 
@@ -791,7 +791,7 @@ gst_multi_socket_sink_clear (GstMultiHandleSink * mhsink)
   CLIENTS_LOCK (sink);
 restart:
   cookie = sink->clients_cookie;
   CLIENTS_LOCK (sink);
 restart:
   cookie = sink->clients_cookie;
-  for (clients = sink->clients; clients; clients = clients->next) {
+  for (clients = sink->clients; clients; clients = next) {
     GstMultiHandleClient *mhclient;
 
     if (cookie != sink->clients_cookie) {
     GstMultiHandleClient *mhclient;
 
     if (cookie != sink->clients_cookie) {
@@ -800,7 +800,11 @@ restart:
     }
 
     mhclient = (GstMultiHandleClient *) clients->data;
     }
 
     mhclient = (GstMultiHandleClient *) clients->data;
+    next = g_list_next (clients);
+
     mhclient->status = GST_CLIENT_STATUS_REMOVED;
     mhclient->status = GST_CLIENT_STATUS_REMOVED;
+    /* the next call changes the list, which is why we iterate
+     * with a temporary next pointer */
     gst_multi_socket_sink_remove_client_link (sink, clients);
   }
 
     gst_multi_socket_sink_remove_client_link (sink, clients);
   }
 
index 4bd2da90047b16c3629685ed36c6185de40c15ff..719fedcdf3512d0c35214c87d6f74eb403bdd3d4 100644 (file)
@@ -587,9 +587,7 @@ GST_START_TEST (test_burst_client_bytes)
   ASSERT_SET_STATE (sink, GST_STATE_NULL, GST_STATE_CHANGE_SUCCESS);
   cleanup_multisocketsink (sink);
 
   ASSERT_SET_STATE (sink, GST_STATE_NULL, GST_STATE_CHANGE_SUCCESS);
   cleanup_multisocketsink (sink);
 
-  // FIXME for slomo: the refcount is now 3 instead of 1 ?
-  // ASSERT_CAPS_REFCOUNT (caps, "caps", 1);
-  ASSERT_CAPS_REFCOUNT (caps, "caps", 3);
+  ASSERT_CAPS_REFCOUNT (caps, "caps", 1);
   gst_caps_unref (caps);
 }
 
   gst_caps_unref (caps);
 }
 
@@ -690,9 +688,7 @@ GST_START_TEST (test_burst_client_bytes_keyframe)
   ASSERT_SET_STATE (sink, GST_STATE_NULL, GST_STATE_CHANGE_SUCCESS);
   cleanup_multisocketsink (sink);
 
   ASSERT_SET_STATE (sink, GST_STATE_NULL, GST_STATE_CHANGE_SUCCESS);
   cleanup_multisocketsink (sink);
 
-  // FIXME for slomo: the refcount is now 3 instead of 1 ?
-  // ASSERT_CAPS_REFCOUNT (caps, "caps", 1);
-  ASSERT_CAPS_REFCOUNT (caps, "caps", 3);
+  ASSERT_CAPS_REFCOUNT (caps, "caps", 1);
   gst_caps_unref (caps);
 }
 
   gst_caps_unref (caps);
 }
 
@@ -798,9 +794,7 @@ GST_START_TEST (test_burst_client_bytes_with_keyframe)
   ASSERT_SET_STATE (sink, GST_STATE_NULL, GST_STATE_CHANGE_SUCCESS);
   cleanup_multisocketsink (sink);
 
   ASSERT_SET_STATE (sink, GST_STATE_NULL, GST_STATE_CHANGE_SUCCESS);
   cleanup_multisocketsink (sink);
 
-  // FIXME for slomo: the refcount is now 3 instead of 1 ?
-  // ASSERT_CAPS_REFCOUNT (caps, "caps", 1);
-  ASSERT_CAPS_REFCOUNT (caps, "caps", 3);
+  ASSERT_CAPS_REFCOUNT (caps, "caps", 1);
   gst_caps_unref (caps);
 }
 
   gst_caps_unref (caps);
 }