More refcounting fixes
authorWim Taymans <wim.taymans@gmail.com>
Fri, 17 Jan 2003 20:02:27 +0000 (20:02 +0000)
committerWim Taymans <wim.taymans@gmail.com>
Fri, 17 Jan 2003 20:02:27 +0000 (20:02 +0000)
Original commit message from CVS:
More refcounting fixes

gst/gstobject.c
gst/gstscheduler.c

index 7fb2542..e01cb30 100644 (file)
@@ -200,6 +200,7 @@ void
 gst_object_unref (GstObject *object)
 {
   g_return_if_fail (GST_IS_OBJECT (object));
+  g_return_if_fail (G_OBJECT (object)->ref_count > 0);
 
   GST_DEBUG (GST_CAT_REFCOUNTING, "unref %p '%s' %d->%d", object,
             GST_OBJECT_NAME (object),
index daca1a6..5aaa3f2 100644 (file)
@@ -89,6 +89,13 @@ gst_scheduler_dispose (GObject *object)
 {
   GstScheduler *sched = GST_SCHEDULER (object);
 
+  /* thse lists should all be NULL */
+  GST_DEBUG (0, "scheduler %p dispose %p %p %p",
+                 object,
+                 sched->clock_providers,
+                 sched->clock_receivers,
+                 sched->schedulers);
+
   gst_object_swap ((GstObject **)&sched->current_clock, NULL);
   gst_object_swap ((GstObject **)&sched->clock, NULL);
 
@@ -378,6 +385,12 @@ gst_scheduler_add_scheduler (GstScheduler *sched, GstScheduler *sched2)
 
   g_return_if_fail (GST_IS_SCHEDULER (sched));
   g_return_if_fail (GST_IS_SCHEDULER (sched2));
+  g_return_if_fail (sched2->parent_sched == NULL);
+
+  GST_DEBUG (0,"gstscheduler: %p add scheduler %p", sched, sched2);
+
+  gst_object_ref (GST_OBJECT (sched2));
+  gst_object_ref (GST_OBJECT (sched));
 
   sched->schedulers = g_list_prepend (sched->schedulers, sched2);
   sched2->parent_sched = sched;
@@ -402,14 +415,20 @@ gst_scheduler_remove_scheduler (GstScheduler *sched, GstScheduler *sched2)
 
   g_return_if_fail (GST_IS_SCHEDULER (sched));
   g_return_if_fail (GST_IS_SCHEDULER (sched2));
+  g_return_if_fail (sched2->parent_sched == sched);
 
-  sched->schedulers = g_list_remove (sched->schedulers, sched2);
-  sched2->parent_sched = NULL;
+  GST_DEBUG (0,"gstscheduler: %p remove scheduler %p", sched, sched2);
 
   sclass = GST_SCHEDULER_GET_CLASS (sched);
 
   if (sclass->remove_scheduler)
     sclass->remove_scheduler (sched, sched2);
+
+  sched->schedulers = g_list_remove (sched->schedulers, sched2);
+  sched2->parent_sched = NULL;
+
+  gst_object_unref (GST_OBJECT (sched2));
+  gst_object_unref (GST_OBJECT (sched));
 }
 
 /**