miniobjects: pass copy, dispose and free function to gst_mini_object_init()
[platform/upstream/gstreamer.git] / gst / gstminiobject.h
index 22c307f..f4e53a2 100644 (file)
@@ -52,10 +52,12 @@ typedef GstMiniObject * (*GstMiniObjectCopyFunction) (const GstMiniObject *obj);
  * Function prototype for when a miniobject has lost its last refcount.
  * Implementation of the mini object are allowed to revive the
  * passed object by doing a gst_mini_object_ref(). If the object is not
- * revived after the dispose function, the memory associated with the
- * object is freed.
+ * revived after the dispose function, the function should return %TRUE
+ * and the memory associated with the object is freed.
+ *
+ * Returns: %TRUE if the object should be cleaned up.
  */
-typedef void (*GstMiniObjectDisposeFunction) (GstMiniObject *obj);
+typedef gboolean (*GstMiniObjectDisposeFunction) (GstMiniObject *obj);
 /**
  * GstMiniObjectFreeFunction:
  * @obj: MiniObject to free
@@ -67,9 +69,9 @@ typedef void (*GstMiniObjectFreeFunction) (GstMiniObject *obj);
 
  /**
  * GstMiniObjectWeakNotify:
- * @data: data that was provided when the weak reference was established
+ * @user_data: data that was provided when the weak reference was established
  * @where_the_mini_object_was: the mini object being finalized
- * 
+ *
  * A #GstMiniObjectWeakNotify function can be added to a mini object as a
  * callback that gets triggered when the mini object is finalized. Since the
  * mini object is already being finalized when the #GstMiniObjectWeakNotify is
@@ -78,14 +80,14 @@ typedef void (*GstMiniObjectFreeFunction) (GstMiniObject *obj);
  *
  * Since: 0.10.35
  */
-typedef void (*GstMiniObjectWeakNotify) (gpointer data,
+typedef void (*GstMiniObjectWeakNotify) (gpointer user_data,
     GstMiniObject * where_the_mini_object_was);
 
 /**
- * GST_MINI_OBJECT_FLAGS:
- * @obj: MiniObject to return flags for.
+ * GST_MINI_OBJECT_TYPE:
+ * @obj: MiniObject to return type for.
  *
- * This macro returns the entire set of flags for the mini-object.
+ * This macro returns the type of the mini-object.
  */
 #define GST_MINI_OBJECT_TYPE(obj)  (GST_MINI_OBJECT_CAST(obj)->type)
 /**
@@ -148,15 +150,8 @@ typedef enum
 #define GST_MINI_OBJECT_REFCOUNT_VALUE(obj)     (g_atomic_int_get (&(GST_MINI_OBJECT_CAST(obj))->refcount))
 
 /**
- * GST_MINI_OBJECT_SIZE:
- * @obj: a #GstMiniObject
- *
- * Get the allocated size of @obj.
- */
-#define GST_MINI_OBJECT_SIZE(obj)              ((GST_MINI_OBJECT_CAST(obj))->size)
-
-/**
  * GstMiniObject:
+ * @type: the GType of the object
  * @refcount: atomic refcount
  * @flags: extra flags.
  * @copy: a copy function
@@ -175,46 +170,57 @@ struct _GstMiniObject {
   /*< public >*/ /* with COW */
   gint    refcount;
   guint   flags;
-  gsize   size;
 
   GstMiniObjectCopyFunction copy;
   GstMiniObjectDisposeFunction dispose;
   GstMiniObjectFreeFunction free;
 
   /* < private > */
-  /* Used to keep track of weak ref notifies */
-  guint n_weak_refs;
-  struct
-  {
-    GstMiniObjectWeakNotify notify;
-    gpointer data;
-  } *weak_refs;
+  /* Used to keep track of weak ref notifies and qdata */
+  guint n_qdata;
+  gpointer qdata;
 };
 
-GType           gst_mini_object_register        (const gchar *name);
+void            gst_mini_object_init (GstMiniObject *mini_object, GType type,
+                                      GstMiniObjectCopyFunction copy_func,
+                                      GstMiniObjectDisposeFunction dispose_func,
+                                      GstMiniObjectFreeFunction free_func);
 
-void            gst_mini_object_init            (GstMiniObject *mini_object,
-                                                 GType type, gsize size);
-
-GstMiniObject* gst_mini_object_copy            (const GstMiniObject *mini_object);
-gboolean       gst_mini_object_is_writable     (const GstMiniObject *mini_object);
-GstMiniObject*  gst_mini_object_make_writable  (GstMiniObject *mini_object);
+GstMiniObject * gst_mini_object_copy           (const GstMiniObject *mini_object) G_GNUC_MALLOC;
+gboolean        gst_mini_object_is_writable    (const GstMiniObject *mini_object);
+GstMiniObject * gst_mini_object_make_writable  (GstMiniObject *mini_object);
 
 /* refcounting */
-GstMiniObject* gst_mini_object_ref             (GstMiniObject *mini_object);
-void           gst_mini_object_unref           (GstMiniObject *mini_object);
+GstMiniObject * gst_mini_object_ref            (GstMiniObject *mini_object);
+void            gst_mini_object_unref          (GstMiniObject *mini_object);
 
-void           gst_mini_object_weak_ref        (GstMiniObject *object,
+void            gst_mini_object_weak_ref        (GstMiniObject *object,
                                                 GstMiniObjectWeakNotify notify,
                                                 gpointer data);
-void           gst_mini_object_weak_unref      (GstMiniObject *object,
+void            gst_mini_object_weak_unref     (GstMiniObject *object,
                                                 GstMiniObjectWeakNotify notify,
                                                 gpointer data);
 
+void            gst_mini_object_set_qdata       (GstMiniObject *object, GQuark quark,
+                                                 gpointer data, GDestroyNotify destroy);
+gpointer        gst_mini_object_get_qdata       (GstMiniObject *object, GQuark quark);
+
+
 gboolean        gst_mini_object_replace         (GstMiniObject **olddata, GstMiniObject *newdata);
 gboolean        gst_mini_object_take            (GstMiniObject **olddata, GstMiniObject *newdata);
 GstMiniObject * gst_mini_object_steal           (GstMiniObject **olddata);
 
+/**
+ * GST_DEFINE_MINI_OBJECT_TYPE:
+ * @TypeName: name of the new type in CamelCase
+ * @type_name: name of the new type
+ *
+ * Define a new mini-object type with the given name
+ */
+#define GST_DEFINE_MINI_OBJECT_TYPE(TypeName,type_name) \
+   G_DEFINE_BOXED_TYPE(TypeName,type_name,              \
+       (GBoxedCopyFunc) gst_mini_object_ref,            \
+       (GBoxedFreeFunc) gst_mini_object_unref)
 
 G_END_DECLS