bool gstObjectIsFloating(GstObject* gstObject) { #ifdef GST_API_VERSION_1 return g_object_is_floating(G_OBJECT(gstObject)); #else return GST_OBJECT_IS_FLOATING(gstObject); #endif }
void rbgst_object_initialize(VALUE obj, gpointer cobj) { if (GST_OBJECT_IS_FLOATING(cobj)) { gst_object_ref(cobj); gst_object_sink(cobj); } rbgobj_gobject_initialize(obj, cobj); }
VALUE rbgst_object_instance2robj(gpointer instance) { if (GST_OBJECT_IS_FLOATING(instance)) { gst_object_ref(instance); gst_object_sink(instance); } return rbgobj_get_ruby_object_from_gobject(instance, TRUE); }
/** * 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_TRACE_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); } }
EXPORT_C #endif gboolean gst_object_set_parent (GstObject * object, GstObject * parent) { g_return_val_if_fail (GST_IS_OBJECT (object), FALSE); g_return_val_if_fail (GST_IS_OBJECT (parent), FALSE); g_return_val_if_fail (object != parent, FALSE); GST_CAT_DEBUG_OBJECT (GST_CAT_REFCOUNTING, object, "set parent (ref and sink)"); GST_OBJECT_LOCK (object); if (G_UNLIKELY (object->parent != NULL)) goto had_parent; /* sink object, we don't call our own function because we don't * need to release/acquire the lock needlessly or touch the refcount * in the floating case. */ object->parent = parent; 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); } g_signal_emit (object, gst_object_signals[PARENT_SET], 0, parent); return TRUE; /* ERROR handling */ had_parent: { GST_CAT_DEBUG_OBJECT (GST_CAT_REFCOUNTING, object, "set parent failed, object already had a parent"); GST_OBJECT_UNLOCK (object); return FALSE; } }
EXPORT_C #endif void gst_object_sink (gpointer object) { g_return_if_fail (GST_IS_OBJECT (object)); GST_CAT_LOG_OBJECT (GST_CAT_REFCOUNTING, object, "sink"); GST_OBJECT_LOCK (object); if (G_LIKELY (GST_OBJECT_IS_FLOATING (object))) { GST_CAT_LOG_OBJECT (GST_CAT_REFCOUNTING, object, "clear floating flag"); GST_OBJECT_FLAG_UNSET (object, GST_OBJECT_FLOATING); GST_OBJECT_UNLOCK (object); gst_object_unref (object); } else { GST_OBJECT_UNLOCK (object); } }
GstElement * rygel_gst_utils_create_source_for_uri (const gchar *uri) { GstElement *src; g_return_val_if_fail (uri != NULL, NULL); src = gst_element_make_from_uri (GST_URI_SRC, uri, NULL); if (src) { if (GST_OBJECT_IS_FLOATING (GST_OBJECT (src))) { gst_object_ref_sink (src); } if (g_object_class_find_property (G_OBJECT_GET_CLASS (src), "blocksize")) { g_object_set (src, "blocksize", (glong) 65536, NULL); } if (g_object_class_find_property (G_OBJECT_GET_CLASS (src), "tcp-timeout")) { g_object_set (src, "tcp-timeout", (gint64) 60000000, NULL); } } return src; }
int main (int argc, gchar * argv[]) { GstElement *element; GstElement *element2; GstPad *pad; long usage1; gint i, iters; gst_init (&argc, &argv); if (argc == 2) iters = atoi (argv[1]); else iters = ITERS; g_print ("starting element with pad test with %d iterations\n", iters); usage1 = vmsize (); element = gst_element_factory_make ("fakesink", NULL);; g_assert (GST_IS_ELEMENT (element)); pad = gst_element_get_pad (element, "sink"); g_assert (GST_IS_PAD (pad)); g_assert (GST_OBJECT_IS_FLOATING (element)); g_assert (!GST_OBJECT_IS_FLOATING (pad)); g_assert (gst_pad_get_parent (pad) == element); gst_object_unref (element); g_print ("create/addpad/unref 1 new element: %ld\n", vmsize () - usage1); for (i = 0; i < iters; i++) { element = gst_element_factory_make ("fakesink", NULL);; g_assert (GST_IS_ELEMENT (element)); gst_object_unref (element); } g_print ("create/unref %d elements: %ld\n", iters, vmsize () - usage1); for (i = 0; i < iters / 2; i++) { element = gst_element_factory_make ("fakesink", NULL); g_assert (GST_IS_ELEMENT (element)); element2 = gst_element_factory_make ("fakesrc", NULL); g_assert (GST_IS_ELEMENT (element2)); gst_element_link_pads (element2, "src", element, "sink"); g_assert (GST_PAD_IS_LINKED (gst_element_get_pad (element2, "src"))); g_assert (GST_PAD_IS_LINKED (gst_element_get_pad (element, "sink"))); gst_object_unref (element); g_assert (!GST_PAD_IS_LINKED (gst_element_get_pad (element2, "src"))); gst_object_unref (element2); } g_print ("create/link/unref %d element duos: %ld\n", iters / 2, vmsize () - usage1); element = gst_element_factory_make ("fakesink", NULL);; g_assert (GST_IS_ELEMENT (element)); pad = gst_element_get_pad (element, "sink"); g_assert (GST_IS_PAD (pad)); gst_element_remove_pad (element, pad); g_assert (gst_element_get_pad (element, "sink") == NULL); gst_object_unref (element); g_print ("pad removal on one element: %ld\n", vmsize () - usage1); for (i = 0; i < iters / 2; i++) { element = gst_element_factory_make ("fakesink", NULL);; g_assert (GST_IS_ELEMENT (element)); pad = gst_element_get_pad (element, "sink"); g_assert (GST_IS_PAD (pad)); gst_element_remove_pad (element, pad); g_assert (gst_element_get_pad (element, "sink") == NULL); gst_object_unref (element); } g_print ("pad removal loop on %d elements: %ld\n", iters / 2, vmsize () - usage1); for (i = 0; i < iters / 2; i++) { element = gst_element_factory_make ("fakesink", NULL);; g_assert (GST_IS_ELEMENT (element)); pad = gst_element_get_pad (element, "sink"); g_assert (GST_IS_PAD (pad)); gst_object_ref (pad); gst_element_remove_pad (element, pad); g_assert (gst_pad_get_parent (pad) == NULL); gst_object_unref (pad); gst_object_unref (element); } g_print ("pad ref/removal/test loop on %d elements: %ld\n", iters / 2, vmsize () - usage1); element = gst_element_factory_make ("fakesink", NULL);; g_assert (GST_IS_ELEMENT (element)); pad = gst_element_get_pad (element, "sink"); g_assert (GST_IS_PAD (pad)); gst_object_unref (element); g_print ("pad unref on one element: %ld\n", vmsize () - usage1); for (i = 0; i < iters / 2; i++) { element = gst_element_factory_make ("fakesink", NULL); g_assert (GST_IS_ELEMENT (element)); pad = gst_element_get_pad (element, "sink"); g_assert (GST_IS_PAD (pad)); gst_object_unref (element); } g_print ("pad unref loop on %d elements: %ld\n", iters / 2, vmsize () - usage1); g_print ("leaked: %ld\n", vmsize () - usage1); return 0; }
template <> GRefPtr<GstPadTemplate> adoptGRef(GstPadTemplate* ptr) { ASSERT(!ptr || !GST_OBJECT_IS_FLOATING(GST_OBJECT(ptr))); return GRefPtr<GstPadTemplate>(ptr, GRefPtrAdopt); }
template <> GRefPtr<GstTask> adoptGRef(GstTask* ptr) { ASSERT(!GST_OBJECT_IS_FLOATING(GST_OBJECT(ptr))); return GRefPtr<GstTask>(ptr, GRefPtrAdopt); }
template <> GRefPtr<GstElementFactory> adoptGRef(GstElementFactory* ptr) { ASSERT(!GST_OBJECT_IS_FLOATING(GST_OBJECT(ptr))); return GRefPtr<GstElementFactory>(ptr, GRefPtrAdopt); }
int main (int argc, gchar * argv[]) { GstElement *element; int usage1; gint i, iters; gst_init (&argc, &argv); if (argc == 2) iters = atoi (argv[1]); else iters = ITERS; g_print ("starting test\n"); usage1 = gst_alloc_trace_live_all (); //gst_alloc_trace_print_all (); element = gst_element_factory_make ("fakesrc", NULL); gst_object_unref (element); g_print ("create/unref new element %d\n", gst_alloc_trace_live_all () - usage1); for (i = 0; i < iters; i++) { element = gst_element_factory_make ("fakesrc", NULL); gst_object_unref (element); } g_print ("create/unref %d elements %d\n", iters, gst_alloc_trace_live_all () - usage1); element = gst_element_factory_make ("fakesrc", NULL); g_assert (GST_OBJECT_IS_FLOATING (element)); gst_object_ref (element); gst_object_sink (GST_OBJECT (element)); g_assert (!GST_OBJECT_IS_FLOATING (element)); gst_object_unref (element); g_print ("create/ref/sink/unref new element %d\n", gst_alloc_trace_live_all () - usage1); for (i = 0; i < iters; i++) { element = gst_element_factory_make ("fakesrc", NULL); gst_object_ref (element); gst_object_sink (GST_OBJECT (element)); gst_object_unref (element); } g_print ("create/ref/sink/unref %d elements %d\n", iters, gst_alloc_trace_live_all () - usage1); #if 0 element = gst_element_factory_make ("fakesrc", NULL); g_assert (!GST_OBJECT_IS_DESTROYED (element)); gst_object_unref (element); g_assert (GST_OBJECT_IS_DESTROYED (element)); gst_object_unref (element); g_print ("create/destroy/unref new element %d\n", gst_alloc_trace_live_all () - usage1); #endif #if 0 for (i = 0; i < iters; i++) { element = gst_element_factory_make ("fakesrc", NULL); gst_object_unref (element); gst_object_unref (element); } g_print ("create/destroy/unref %d element %d\n", iters, gst_alloc_trace_live_all () - usage1); #endif element = gst_element_factory_make ("fakesrc", NULL); gst_object_ref (element); gst_object_unref (element); gst_object_unref (element); g_print ("create/ref/unref/unref new element %d\n", gst_alloc_trace_live_all () - usage1); for (i = 0; i < iters; i++) { element = gst_element_factory_make ("fakesrc", NULL); gst_object_ref (element); gst_object_unref (element); gst_object_unref (element); } g_print ("create/ref/unref/unref %d element %d\n", iters, gst_alloc_trace_live_all () - usage1); #if 0 element = gst_element_factory_make ("fakesrc", NULL); gst_object_ref (element); gst_object_unref (element); gst_object_unref (element); gst_object_unref (element); g_print ("craete/ref/destroy/unref/unref new element %d\n", gst_alloc_trace_live_all () - usage1); #endif #if 0 for (i = 0; i < iters; i++) { element = gst_element_factory_make ("fakesrc", NULL); gst_object_ref (element); gst_object_unref (element); gst_object_unref (element); gst_object_unref (element); } g_print ("craete/ref/destroy/unref/unref %d elements %d\n", iters, gst_alloc_trace_live_all () - usage1); #endif #if 0 for (i = 0; i < iters; i++) { element = gst_element_factory_make ("fakesrc", NULL); gst_object_ref (element); gst_element_set_name (element, "testing123"); gst_object_unref (element); gst_element_set_name (element, "testing123"); gst_object_unref (element); gst_object_unref (element); } g_print ("craete/ref/destroy/unref/unref %d elements with name %d\n", iters, gst_alloc_trace_live_all () - usage1); #endif element = gst_element_factory_make ("fakesrc", NULL); for (i = 0; i < iters; i++) { gst_element_set_name (element, "testing"); } gst_object_unref (element); g_print ("set name %d times %d\n", iters, gst_alloc_trace_live_all () - usage1); g_print ("leaked: %d\n", gst_alloc_trace_live_all () - usage1); return (gst_alloc_trace_live_all () - usage1 ? -1 : 0); }