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 1f4dd15..5257d4e 100644 (file)
@@ -855,6 +855,8 @@ restart:
     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);
index b01575d..44f62c6 100644 (file)
@@ -782,7 +782,7 @@ done:
 void
 gst_multi_socket_sink_clear (GstMultiHandleSink * mhsink)
 {
-  GList *clients;
+  GList *clients, *next;
   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;
-  for (clients = sink->clients; clients; clients = clients->next) {
+  for (clients = sink->clients; clients; clients = next) {
     GstMultiHandleClient *mhclient;
 
     if (cookie != sink->clients_cookie) {
@@ -800,7 +800,11 @@ restart:
     }
 
     mhclient = (GstMultiHandleClient *) clients->data;
+    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_socket_sink_remove_client_link (sink, clients);
   }
 
index 4bd2da9..719fedc 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);
 
-  // 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);
 }
 
@@ -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);
 
-  // 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);
 }
 
@@ -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);
 
-  // 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);
 }