gstobject: add gst_object_ref_sink
authorWim Taymans <wim.taymans@collabora.co.uk>
Sat, 2 May 2009 12:33:01 +0000 (14:33 +0200)
committerWim Taymans <wim@metal.(none)>
Mon, 11 May 2009 20:35:08 +0000 (22:35 +0200)
Add the gst_object_ref_sink() method to match the glib one.

API: GstObject::gst_object_ref_sink()

docs/gst/gstreamer-sections.txt
gst/gstobject.c
gst/gstobject.h
win32/common/libgstreamer.def

index eb28680..789ef4f 100644 (file)
@@ -1214,6 +1214,7 @@ gst_object_save_thyself
 gst_object_restore_thyself
 gst_object_ref
 gst_object_unref
+gst_object_ref_sink
 gst_object_sink
 gst_object_replace
 gst_object_get_path_string
index 701c3eb..ef0a86b 100644 (file)
@@ -327,6 +327,39 @@ gst_object_unref (gpointer object)
 }
 
 /**
+ * gst_object_ref_sink:
+ * @object: a #GstObject to sink
+ *
+ * Increase the reference count of @object, and possibly remove the floating
+ * reference, if @object has a floating reference.
+ *
+ * In other words, if the object is floating, then this call "assumes ownership"
+ * of the floating reference, converting it to a normal reference by clearing
+ * the floating flag while leaving the reference count unchanged. If the object
+ * is not floating, then this call adds a new normal reference increasing the
+ * reference count by one.
+ *
+ * MT safe. This function grabs and releases @object lock.
+ *
+ * Since: 0.10.24
+ */
+void
+gst_object_ref_sink (gpointer object)
+{
+  g_return_if_fail (GST_IS_OBJECT (object));
+
+  GST_OBJECT_LOCK (object);
+  if (G_LIKELY (GST_OBJECT_IS_FLOATING (object))) {
+    GST_CAT_LOG_OBJECT (GST_CAT_REFCOUNTING, object, "unsetting floating flag");
+    GST_OBJECT_FLAG_UNSET (object, GST_OBJECT_FLOATING);
+    GST_OBJECT_UNLOCK (object);
+  } else {
+    GST_OBJECT_UNLOCK (object);
+    gst_object_ref (object);
+  }
+}
+
+/**
  * gst_object_sink:
  * @object: a #GstObject to sink
  *
index f49a727..5d7a50b 100644 (file)
@@ -290,6 +290,7 @@ void            gst_object_default_deep_notify      (GObject *object, GstObject *ori
 /* refcounting + life cycle */
 gpointer       gst_object_ref                  (gpointer object);
 void           gst_object_unref                (gpointer object);
+void           gst_object_ref_sink             (gpointer object);
 void           gst_object_sink                 (gpointer object);
 
 /* replace object pointer */
index 0840222..339f2e6 100644 (file)
@@ -511,6 +511,7 @@ EXPORTS
        gst_object_get_type
        gst_object_has_ancestor
        gst_object_ref
+       gst_object_ref_sink
        gst_object_replace
        gst_object_restore_thyself
        gst_object_save_thyself