discoverer: Validate timeouts before processing them
authorArun Raghavan <arun.raghavan@collabora.co.uk>
Mon, 17 Jan 2011 10:00:08 +0000 (15:30 +0530)
committerTim-Philipp Müller <tim.muller@collabora.co.uk>
Mon, 17 Jan 2011 23:50:45 +0000 (23:50 +0000)
This avoids a race where the timeout callback is scheduled to run but we
get sufficient information to finish discovery before actually getting
around to executing the callback. See the documentation of
g_source_is_destroyed() for more details.

https://bugzilla.gnome.org/show_bug.cgi?id=639730

gst-libs/gst/pbutils/gstdiscoverer.c

index ab32b91..46e2cfb 100644 (file)
@@ -1153,12 +1153,14 @@ discoverer_bus_cb (GstBus * bus, GstMessage * msg, GstDiscoverer * dc)
 static gboolean
 async_timeout_cb (GstDiscoverer * dc)
 {
-  dc->priv->timeoutid = 0;
-  GST_DEBUG ("Setting result to TIMEOUT");
-  dc->priv->current_info->result = GST_DISCOVERER_TIMEOUT;
-  dc->priv->processing = FALSE;
-  discoverer_collect (dc);
-  discoverer_cleanup (dc);
+  if (!g_source_is_destroyed (g_main_current_source ())) {
+    dc->priv->timeoutid = 0;
+    GST_DEBUG ("Setting result to TIMEOUT");
+    dc->priv->current_info->result = GST_DISCOVERER_TIMEOUT;
+    dc->priv->processing = FALSE;
+    discoverer_collect (dc);
+    discoverer_cleanup (dc);
+  }
   return FALSE;
 }