clock: fix racy shutdown clock id leak
authorTrond Andersen <trond.andersen@tandberg.com>
Tue, 12 Jan 2010 16:10:59 +0000 (17:10 +0100)
committerSebastian Dröge <sebastian.droege@collabora.co.uk>
Thu, 23 Sep 2010 19:54:01 +0000 (21:54 +0200)
Clock IDs were leaked if the clock got disposed before the worker thread
got a chance to reap unscheduled entries.

Fixes bug #630439.

gst/gstsystemclock.c

index 87fb4d7..6b31bab 100644 (file)
@@ -198,8 +198,6 @@ gst_system_clock_dispose (GObject * object)
     GST_CAT_DEBUG (GST_CAT_CLOCK, "unscheduling entry %p", entry);
     entry->status = GST_CLOCK_UNSCHEDULED;
   }
-  g_list_free (clock->entries);
-  clock->entries = NULL;
   GST_CLOCK_BROADCAST (clock);
   gst_system_clock_add_wakeup (sysclock);
   GST_OBJECT_UNLOCK (clock);
@@ -209,6 +207,10 @@ gst_system_clock_dispose (GObject * object)
   sysclock->thread = NULL;
   GST_CAT_DEBUG (GST_CAT_CLOCK, "joined thread");
 
+  g_list_foreach (clock->entries, (GFunc) gst_clock_id_unref, NULL);
+  g_list_free (clock->entries);
+  clock->entries = NULL;
+
   gst_poll_free (sysclock->priv->timer);
 
   G_OBJECT_CLASS (parent_class)->dispose (object);