+2005-04-21 Wim Taymans <wim@fluendo.com>
+
+ * gst/gstmessage.c: (_gst_message_copy), (_gst_message_free),
+ (gst_message_new), (gst_message_new_error),
+ (gst_message_new_warning), (gst_message_new_tag),
+ (gst_message_new_state_changed), (gst_message_new_application),
+ (gst_message_get_structure):
+ * gst/gstmessage.h:
+ * gst/gststructure.c: (gst_structure_set_parent_refcount),
+ (gst_structure_copy_conditional):
+ Use parent refcount in GstMessage to ensure GstStructure
+ consistency.
+ Cleaned up headers a bit.
+
+
2005-04-20 Wim Taymans <wim@fluendo.com>
* gst/base/gstbasesink.c: (gst_basesink_base_init),
gst_object_ref (GST_MESSAGE_SRC (copy));
}
- if (copy->structure)
- copy->structure = gst_structure_copy (copy->structure);
+ if (message->structure) {
+ copy->structure = gst_structure_copy (message->structure);
+ gst_structure_set_parent_refcount (copy->structure,
+ &GST_DATA_REFCOUNT (message));
+ }
return copy;
}
GST_MESSAGE_UNLOCK (message);
}
- if (message->structure)
+ if (message->structure) {
+ gst_structure_set_parent_refcount (message->structure, NULL);
gst_structure_free (message->structure);
+ }
_GST_DATA_DISPOSE (GST_DATA (message));
#ifndef GST_DISABLE_TRACE
message = gst_message_new (GST_MESSAGE_ERROR, src);
s = gst_structure_new ("GstMessageError", "gerror", G_TYPE_POINTER, error,
"debug", G_TYPE_STRING, debug, NULL);
+ gst_structure_set_parent_refcount (s, &GST_DATA_REFCOUNT (message));
message->structure = s;
return message;
message = gst_message_new (GST_MESSAGE_WARNING, src);
s = gst_structure_new ("GstMessageWarning", "gerror", G_TYPE_POINTER, error,
"debug", G_TYPE_STRING, debug, NULL);
+ gst_structure_set_parent_refcount (s, &GST_DATA_REFCOUNT (message));
message->structure = s;
return message;
{
GstMessage *message;
+ g_return_val_if_fail (GST_IS_STRUCTURE (tag_list), NULL);
+
message = gst_message_new (GST_MESSAGE_TAG, src);
+ gst_structure_set_parent_refcount (tag_list, &GST_DATA_REFCOUNT (message));
message->structure = tag_list;
return message;
s = gst_structure_new ("GstMessageError", "old-state", G_TYPE_INT, (gint) old,
"new-state", G_TYPE_INT, (gint) new, NULL);
+ gst_structure_set_parent_refcount (s, &GST_DATA_REFCOUNT (message));
message->structure = s;
return message;
{
GstMessage *message;
+ g_return_val_if_fail (GST_IS_STRUCTURE (structure), NULL);
+
message = gst_message_new (GST_MESSAGE_APPLICATION, NULL);
+ gst_structure_set_parent_refcount (structure, &GST_DATA_REFCOUNT (message));
message->structure = structure;
return message;
*
* Access the structure of the message.
*
- * Returns: The structure of the message, owned by the message.
+ * Returns: The structure of the message. The structure is still
+ * owned by the message, which means that you should not free it and
+ * that the pointer becomes invalid when you free the message.
*
* MT safe.
*/
gst_message_get_structure (GstMessage * message)
{
g_return_val_if_fail (GST_IS_MESSAGE (message), NULL);
+
return message->structure;
}
GstMessage * gst_message_new (GstMessageType type, GstObject * src);
/* refcounting */
-#define gst_message_ref(ev) GST_MESSAGE (gst_data_ref (GST_DATA (ev)))
-#define gst_message_ref_by_count(ev,c) GST_MESSAGE (gst_data_ref_by_count (GST_DATA (ev), c))
-#define gst_message_unref(ev) gst_data_unref (GST_DATA (ev))
+#define gst_message_ref(msg) GST_MESSAGE (gst_data_ref (GST_DATA (msg)))
+#define gst_message_ref_by_count(msg,c) GST_MESSAGE (gst_data_ref_by_count (GST_DATA (msg), (c)))
+#define gst_message_unref(msg) gst_data_unref (GST_DATA (msg))
/* copy message */
-#define gst_message_copy(ev) GST_MESSAGE (gst_data_copy (GST_DATA (ev)))
+#define gst_message_copy(msg) GST_MESSAGE (gst_data_copy (GST_DATA (msg)))
+#define gst_message_copy_on_write(msg) GST_MESSAGE (gst_data_copy_on_write (GST_DATA (msg)))
GstMessage * gst_message_new_eos (GstObject * src);
GstMessage * gst_message_new_error (GstObject * src, GError * error, gchar * debug);
GstElementState new_state);
GstMessage * gst_message_new_application (GstStructure *structure);
-const GstStructure * gst_message_get_structure (GstMessage *message);
-
+void gst_message_parse_error (GstMessage *message, GError **gerror, gchar **debug);
+void gst_message_parse_warning (GstMessage *message, GError **gerror, gchar **debug);
void gst_message_parse_tag (GstMessage *message, GstTagList **tag_list);
void gst_message_parse_state_changed (GstMessage *message, GstElementState *old_state,
GstElementState *new_state);
-void gst_message_parse_error (GstMessage *message, GError **gerror, gchar **debug);
-void gst_message_parse_warning (GstMessage *message, GError **gerror, gchar **debug);
+const GstStructure * gst_message_get_structure (GstMessage *message);
G_END_DECLS
gst_structure_set_parent_refcount (GstStructure * structure,
GstAtomicInt * refcount)
{
+ g_return_if_fail (structure != NULL);
+
+ /* if we have a parent_refcount already, we can only clear
+ * if with a NULL refcount */
if (structure->parent_refcount)
g_return_if_fail (refcount == NULL);
else
* @structure: the #GstStructure to free
*
* Frees a #GstStructure and all its fields and values. The structure must not
- * parent when this function is called.
+ * have a parent when this function is called.
*/
void
gst_structure_free (GstStructure * structure)