mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-12 03:16:33 +00:00
Refcounting fixes to make the testsuite succeed.
Original commit message from CVS: Refcounting fixes to make the testsuite succeed. Added a ne w category for REFCOUNTING.
This commit is contained in:
parent
13c4e92c04
commit
d5cb52427f
6 changed files with 47 additions and 17 deletions
|
@ -51,7 +51,7 @@ static void gst_element_init (GstElement *element);
|
||||||
static void gst_element_set_arg (GtkObject *object, GtkArg *arg, guint id);
|
static void gst_element_set_arg (GtkObject *object, GtkArg *arg, guint id);
|
||||||
static void gst_element_get_arg (GtkObject *object, GtkArg *arg, guint id);
|
static void gst_element_get_arg (GtkObject *object, GtkArg *arg, guint id);
|
||||||
|
|
||||||
static void gst_element_finalize (GtkObject *object);
|
static void gst_element_real_destroy (GtkObject *object);
|
||||||
|
|
||||||
static GstElementStateReturn gst_element_change_state (GstElement *element);
|
static GstElementStateReturn gst_element_change_state (GstElement *element);
|
||||||
|
|
||||||
|
@ -120,7 +120,7 @@ gst_element_class_init (GstElementClass *klass)
|
||||||
|
|
||||||
gtkobject_class->set_arg = GST_DEBUG_FUNCPTR(gst_element_set_arg);
|
gtkobject_class->set_arg = GST_DEBUG_FUNCPTR(gst_element_set_arg);
|
||||||
gtkobject_class->get_arg = GST_DEBUG_FUNCPTR(gst_element_get_arg);
|
gtkobject_class->get_arg = GST_DEBUG_FUNCPTR(gst_element_get_arg);
|
||||||
gtkobject_class->finalize = GST_DEBUG_FUNCPTR(gst_element_finalize);
|
gtkobject_class->destroy = GST_DEBUG_FUNCPTR(gst_element_real_destroy);
|
||||||
|
|
||||||
gstobject_class->save_thyself = GST_DEBUG_FUNCPTR(gst_element_save_thyself);
|
gstobject_class->save_thyself = GST_DEBUG_FUNCPTR(gst_element_save_thyself);
|
||||||
gstobject_class->restore_thyself = GST_DEBUG_FUNCPTR(gst_element_restore_thyself);
|
gstobject_class->restore_thyself = GST_DEBUG_FUNCPTR(gst_element_restore_thyself);
|
||||||
|
@ -836,24 +836,25 @@ GST_ELEMENT_NAME(element),GST_ELEMENT_NAME(GST_ELEMENT_PARENT(element)),GST_ELEM
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_element_finalize (GtkObject *object)
|
gst_element_real_destroy (GtkObject *object)
|
||||||
{
|
{
|
||||||
GstElement *element = GST_ELEMENT (object);
|
GstElement *element = GST_ELEMENT (object);
|
||||||
GList *pads;
|
GList *pads;
|
||||||
GstPad *pad;
|
GstPad *pad;
|
||||||
|
|
||||||
//g_print("element_finalize()\n");
|
GST_DEBUG (GST_CAT_REFCOUNTING, "destroy\n");
|
||||||
|
|
||||||
pads = element->pads;
|
pads = element->pads;
|
||||||
while (pads) {
|
while (pads) {
|
||||||
pad = GST_PAD (pads->data);
|
pad = GST_PAD (pads->data);
|
||||||
gst_pad_destroy (pad);
|
gst_object_unref (GST_OBJECT (pad));
|
||||||
pads = g_list_next (pads);
|
pads = g_list_next (pads);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_list_free (element->pads);
|
g_list_free (element->pads);
|
||||||
|
|
||||||
GTK_OBJECT_CLASS (parent_class)->finalize (object);
|
if (GTK_OBJECT_CLASS (parent_class)->destroy)
|
||||||
|
GTK_OBJECT_CLASS (parent_class)->destroy (object);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -55,6 +55,7 @@ static gchar *_gst_info_category_strings[] = {
|
||||||
"TYPES",
|
"TYPES",
|
||||||
"XML",
|
"XML",
|
||||||
"NEGOTIATION",
|
"NEGOTIATION",
|
||||||
|
"REFCOUNTING",
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -106,6 +107,7 @@ const gchar *_gst_category_colors[32] = {
|
||||||
[GST_CAT_TYPES] = "01;37;41", // !!
|
[GST_CAT_TYPES] = "01;37;41", // !!
|
||||||
[GST_CAT_XML] = "01;37;41", // !!
|
[GST_CAT_XML] = "01;37;41", // !!
|
||||||
[GST_CAT_NEGOTIATION] = "07;34",
|
[GST_CAT_NEGOTIATION] = "07;34",
|
||||||
|
[GST_CAT_REFCOUNTING] = "00;34:42",
|
||||||
|
|
||||||
[31] = "",
|
[31] = "",
|
||||||
};
|
};
|
||||||
|
|
|
@ -87,6 +87,7 @@ enum {
|
||||||
GST_CAT_TYPES, // Typing
|
GST_CAT_TYPES, // Typing
|
||||||
GST_CAT_XML, // XML load/save of everything
|
GST_CAT_XML, // XML load/save of everything
|
||||||
GST_CAT_NEGOTIATION, // Caps Negotiation stuff
|
GST_CAT_NEGOTIATION, // Caps Negotiation stuff
|
||||||
|
GST_CAT_REFCOUNTING, // Ref Counting stuff
|
||||||
|
|
||||||
GST_CAT_MAX_CATEGORY = 31
|
GST_CAT_MAX_CATEGORY = 31
|
||||||
};
|
};
|
||||||
|
|
|
@ -158,7 +158,8 @@ gst_object_ref (GstObject *object)
|
||||||
{
|
{
|
||||||
g_return_val_if_fail (GST_IS_OBJECT (object), NULL);
|
g_return_val_if_fail (GST_IS_OBJECT (object), NULL);
|
||||||
|
|
||||||
//g_print ("object_ref\n");
|
GST_DEBUG (GST_CAT_REFCOUNTING, "ref\n");
|
||||||
|
|
||||||
gtk_object_ref (GTK_OBJECT (object));
|
gtk_object_ref (GTK_OBJECT (object));
|
||||||
|
|
||||||
return object;
|
return object;
|
||||||
|
@ -177,7 +178,8 @@ gst_object_unref (GstObject *object)
|
||||||
{
|
{
|
||||||
g_return_if_fail (GST_IS_OBJECT (object));
|
g_return_if_fail (GST_IS_OBJECT (object));
|
||||||
|
|
||||||
//g_print ("object_unref\n");
|
GST_DEBUG (GST_CAT_REFCOUNTING, "unref\n");
|
||||||
|
|
||||||
gtk_object_unref (GTK_OBJECT (object));
|
gtk_object_unref (GTK_OBJECT (object));
|
||||||
}
|
}
|
||||||
#define gst_object_unref gst_object_unref
|
#define gst_object_unref gst_object_unref
|
||||||
|
@ -196,7 +198,7 @@ gst_object_sink (GstObject *object)
|
||||||
g_return_if_fail (object != NULL);
|
g_return_if_fail (object != NULL);
|
||||||
g_return_if_fail (GST_IS_OBJECT (object));
|
g_return_if_fail (GST_IS_OBJECT (object));
|
||||||
|
|
||||||
//g_print ("object_sink\n");
|
GST_DEBUG (GST_CAT_REFCOUNTING, "sink\n");
|
||||||
if (GST_OBJECT_FLOATING (object))
|
if (GST_OBJECT_FLOATING (object))
|
||||||
{
|
{
|
||||||
GST_FLAG_UNSET (object, GST_FLOATING);
|
GST_FLAG_UNSET (object, GST_FLOATING);
|
||||||
|
@ -210,7 +212,7 @@ gst_object_destroy (GstObject *object)
|
||||||
g_return_if_fail (object != NULL);
|
g_return_if_fail (object != NULL);
|
||||||
g_return_if_fail (GST_IS_OBJECT (object));
|
g_return_if_fail (GST_IS_OBJECT (object));
|
||||||
|
|
||||||
//g_print ("object_destroy\n");
|
GST_DEBUG (GST_CAT_REFCOUNTING, "destroy\n");
|
||||||
if (!GST_OBJECT_DESTROYED (object))
|
if (!GST_OBJECT_DESTROYED (object))
|
||||||
{
|
{
|
||||||
/* need to hold a reference count around all class method
|
/* need to hold a reference count around all class method
|
||||||
|
@ -225,7 +227,7 @@ gst_object_destroy (GstObject *object)
|
||||||
static void
|
static void
|
||||||
gst_object_shutdown (GtkObject *object)
|
gst_object_shutdown (GtkObject *object)
|
||||||
{
|
{
|
||||||
//g_print ("object_shutdown\n");
|
GST_DEBUG (GST_CAT_REFCOUNTING, "shutdown\n");
|
||||||
GST_FLAG_SET (GST_OBJECT (object), GST_DESTROYED);
|
GST_FLAG_SET (GST_OBJECT (object), GST_DESTROYED);
|
||||||
parent_class->shutdown (GTK_OBJECT (object));
|
parent_class->shutdown (GTK_OBJECT (object));
|
||||||
}
|
}
|
||||||
|
@ -234,6 +236,8 @@ gst_object_shutdown (GtkObject *object)
|
||||||
static void
|
static void
|
||||||
gst_object_real_destroy (GtkObject *gtk_object)
|
gst_object_real_destroy (GtkObject *gtk_object)
|
||||||
{
|
{
|
||||||
|
GST_DEBUG (GST_CAT_REFCOUNTING, "destroy\n");
|
||||||
|
|
||||||
parent_class->destroy (gtk_object);
|
parent_class->destroy (gtk_object);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -245,7 +249,7 @@ gst_object_finalize (GtkObject *gtk_object)
|
||||||
|
|
||||||
object = GST_OBJECT (gtk_object);
|
object = GST_OBJECT (gtk_object);
|
||||||
|
|
||||||
//g_print ("object_finalize\n");
|
GST_DEBUG (GST_CAT_REFCOUNTING, "finalize\n");
|
||||||
if (object->name != NULL)
|
if (object->name != NULL)
|
||||||
g_free (object->name);
|
g_free (object->name);
|
||||||
|
|
||||||
|
|
30
gst/gstpad.c
30
gst/gstpad.c
|
@ -272,6 +272,8 @@ gst_pad_new_from_template (GstPadTemplate *templ,
|
||||||
g_return_val_if_fail (templ != NULL, NULL);
|
g_return_val_if_fail (templ != NULL, NULL);
|
||||||
|
|
||||||
pad = gst_pad_new (name, templ->direction);
|
pad = gst_pad_new (name, templ->direction);
|
||||||
|
gst_object_ref (GST_OBJECT (templ));
|
||||||
|
gst_object_sink (GST_OBJECT (templ));
|
||||||
GST_PAD_PADTEMPLATE(pad) = templ;
|
GST_PAD_PADTEMPLATE(pad) = templ;
|
||||||
|
|
||||||
return pad;
|
return pad;
|
||||||
|
@ -554,6 +556,14 @@ gst_pad_disconnect (GstPad *srcpad,
|
||||||
g_return_if_fail (GST_RPAD_PEER(realsrc) != NULL);
|
g_return_if_fail (GST_RPAD_PEER(realsrc) != NULL);
|
||||||
g_return_if_fail (GST_RPAD_PEER(realsink) != NULL);
|
g_return_if_fail (GST_RPAD_PEER(realsink) != NULL);
|
||||||
|
|
||||||
|
if ((GST_RPAD_DIRECTION(realsrc) == GST_PAD_SINK) &&
|
||||||
|
(GST_RPAD_DIRECTION(realsink) == GST_PAD_SRC)) {
|
||||||
|
GstRealPad *temppad;
|
||||||
|
|
||||||
|
temppad = realsrc;
|
||||||
|
realsrc = realsink;
|
||||||
|
realsink = temppad;
|
||||||
|
}
|
||||||
g_return_if_fail ((GST_RPAD_DIRECTION(realsrc) == GST_PAD_SRC) &&
|
g_return_if_fail ((GST_RPAD_DIRECTION(realsrc) == GST_PAD_SRC) &&
|
||||||
(GST_RPAD_DIRECTION(realsink) == GST_PAD_SINK));
|
(GST_RPAD_DIRECTION(realsink) == GST_PAD_SINK));
|
||||||
|
|
||||||
|
@ -566,7 +576,10 @@ gst_pad_disconnect (GstPad *srcpad,
|
||||||
gtk_signal_emit(GTK_OBJECT(realsink), gst_real_pad_signals[REAL_DISCONNECTED], realsrc);
|
gtk_signal_emit(GTK_OBJECT(realsink), gst_real_pad_signals[REAL_DISCONNECTED], realsrc);
|
||||||
|
|
||||||
// now tell the scheduler
|
// now tell the scheduler
|
||||||
GST_SCHEDULE_PAD_DISCONNECT (realsrc->sched, (GstPad *)realsrc, (GstPad *)realsink);
|
if (realsrc->sched)
|
||||||
|
GST_SCHEDULE_PAD_DISCONNECT (realsrc->sched, (GstPad *)realsrc, (GstPad *)realsink);
|
||||||
|
if (realsink->sched)
|
||||||
|
GST_SCHEDULE_PAD_DISCONNECT (realsink->sched, (GstPad *)realsrc, (GstPad *)realsink);
|
||||||
|
|
||||||
GST_INFO (GST_CAT_ELEMENT_PADS, "disconnected %s:%s and %s:%s",
|
GST_INFO (GST_CAT_ELEMENT_PADS, "disconnected %s:%s and %s:%s",
|
||||||
GST_DEBUG_PAD_NAME(srcpad), GST_DEBUG_PAD_NAME(sinkpad));
|
GST_DEBUG_PAD_NAME(srcpad), GST_DEBUG_PAD_NAME(sinkpad));
|
||||||
|
@ -586,7 +599,6 @@ gst_pad_connect (GstPad *srcpad,
|
||||||
GstPad *sinkpad)
|
GstPad *sinkpad)
|
||||||
{
|
{
|
||||||
GstRealPad *realsrc, *realsink;
|
GstRealPad *realsrc, *realsink;
|
||||||
GstRealPad *temppad;
|
|
||||||
gboolean negotiated = FALSE;
|
gboolean negotiated = FALSE;
|
||||||
|
|
||||||
/* generic checks */
|
/* generic checks */
|
||||||
|
@ -605,6 +617,8 @@ gst_pad_connect (GstPad *srcpad,
|
||||||
/* check for reversed directions and swap if necessary */
|
/* check for reversed directions and swap if necessary */
|
||||||
if ((GST_RPAD_DIRECTION(realsrc) == GST_PAD_SINK) &&
|
if ((GST_RPAD_DIRECTION(realsrc) == GST_PAD_SINK) &&
|
||||||
(GST_RPAD_DIRECTION(realsink) == GST_PAD_SRC)) {
|
(GST_RPAD_DIRECTION(realsink) == GST_PAD_SRC)) {
|
||||||
|
GstRealPad *temppad;
|
||||||
|
|
||||||
temppad = realsrc;
|
temppad = realsrc;
|
||||||
realsrc = realsink;
|
realsrc = realsink;
|
||||||
realsink = temppad;
|
realsink = temppad;
|
||||||
|
@ -996,15 +1010,23 @@ gst_pad_get_bufferpool (GstPad *pad)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// FIXME this needs to be rethought soon
|
|
||||||
static void
|
static void
|
||||||
gst_real_pad_destroy (GtkObject *object)
|
gst_real_pad_destroy (GtkObject *object)
|
||||||
{
|
{
|
||||||
GstPad *pad = GST_PAD (object);
|
GstPad *pad = GST_PAD (object);
|
||||||
|
|
||||||
// g_print("in gst_pad_real_destroy()\n");
|
GST_DEBUG (GST_CAT_REFCOUNTING, "destroy\n");
|
||||||
|
|
||||||
|
if (GST_PAD (pad)->padtemplate)
|
||||||
|
gst_object_unref (GST_OBJECT (GST_PAD (pad)->padtemplate));
|
||||||
|
|
||||||
|
if (GST_PAD_PEER (object))
|
||||||
|
gst_pad_disconnect (GST_PAD (object), GST_PAD (GST_PAD_PEER (object)));
|
||||||
|
|
||||||
g_list_free (GST_REAL_PAD(pad)->ghostpads);
|
g_list_free (GST_REAL_PAD(pad)->ghostpads);
|
||||||
|
|
||||||
|
if (GTK_OBJECT_CLASS (real_pad_parent_class)->destroy)
|
||||||
|
GTK_OBJECT_CLASS (real_pad_parent_class)->destroy (object);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -360,6 +360,7 @@ GstBuffer* gst_pad_pullregion (GstPad *pad, GstRegionType type, guint64 offset
|
||||||
#define gst_pad_eos(pad) (GST_RPAD_EOSFUNC(GST_RPAD_PEER(pad))(GST_PAD(GST_RPAD_PEER(pad))))
|
#define gst_pad_eos(pad) (GST_RPAD_EOSFUNC(GST_RPAD_PEER(pad))(GST_PAD(GST_RPAD_PEER(pad))))
|
||||||
gboolean gst_pad_set_eos (GstPad *pad);
|
gboolean gst_pad_set_eos (GstPad *pad);
|
||||||
|
|
||||||
|
gboolean gst_pad_eos_func (GstPad *pad);
|
||||||
void gst_pad_handle_qos (GstPad *pad, glong qos_message);
|
void gst_pad_handle_qos (GstPad *pad, glong qos_message);
|
||||||
|
|
||||||
void gst_pad_load_and_connect (xmlNodePtr self, GstObject *parent);
|
void gst_pad_load_and_connect (xmlNodePtr self, GstObject *parent);
|
||||||
|
@ -383,7 +384,6 @@ GstCaps* gst_padtemplate_get_caps_by_name (GstPadTemplate *templ, const gchar *
|
||||||
xmlNodePtr gst_padtemplate_save_thyself (GstPadTemplate *templ, xmlNodePtr parent);
|
xmlNodePtr gst_padtemplate_save_thyself (GstPadTemplate *templ, xmlNodePtr parent);
|
||||||
GstPadTemplate* gst_padtemplate_load_thyself (xmlNodePtr parent);
|
GstPadTemplate* gst_padtemplate_load_thyself (xmlNodePtr parent);
|
||||||
|
|
||||||
gboolean gst_pad_eos_func (GstPad *pad);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue