| 1 | /* GStreamer |
| 2 | * Copyright (C) 2005 David Schleef <ds@schleef.org> |
| 3 | * |
| 4 | * gstminiobject.h: Header for GstMiniObject |
| 5 | * |
| 6 | * This library is free software; you can redistribute it and/or |
| 7 | * modify it under the terms of the GNU Library General Public |
| 8 | * License as published by the Free Software Foundation; either |
| 9 | * version 2 of the License, or (at your option) any later version. |
| 10 | * |
| 11 | * This library is distributed in the hope that it will be useful, |
| 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 14 | * Library General Public License for more details. |
| 15 | * |
| 16 | * You should have received a copy of the GNU Library General Public |
| 17 | * License along with this library; if not, write to the |
| 18 | * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, |
| 19 | * Boston, MA 02110-1301, USA. |
| 20 | */ |
| 21 | |
| 22 | |
| 23 | #ifndef __GST_MINI_OBJECT_H__ |
| 24 | #define __GST_MINI_OBJECT_H__ |
| 25 | |
| 26 | #include <gst/gstconfig.h> |
| 27 | |
| 28 | #include <glib-object.h> |
| 29 | |
| 30 | G_BEGIN_DECLS |
| 31 | |
| 32 | GST_API GType _gst_mini_object_type; |
| 33 | |
| 34 | #define GST_TYPE_MINI_OBJECT (_gst_mini_object_type) |
| 35 | |
| 36 | #define GST_IS_MINI_OBJECT_TYPE(obj,type) ((obj) && GST_MINI_OBJECT_TYPE(obj) == (type)) |
| 37 | #define GST_MINI_OBJECT_CAST(obj) ((GstMiniObject*)(obj)) |
| 38 | #define GST_MINI_OBJECT_CONST_CAST(obj) ((const GstMiniObject*)(obj)) |
| 39 | #define GST_MINI_OBJECT(obj) (GST_MINI_OBJECT_CAST(obj)) |
| 40 | |
| 41 | typedef struct _GstMiniObject GstMiniObject; |
| 42 | |
| 43 | GST_API |
| 44 | GType gst_mini_object_get_type (void); |
| 45 | |
| 46 | /** |
| 47 | * GstMiniObjectCopyFunction: |
| 48 | * @obj: MiniObject to copy |
| 49 | * |
| 50 | * Function prototype for methods to create copies of instances. |
| 51 | * |
| 52 | * Returns: reference to cloned instance. |
| 53 | */ |
| 54 | typedef GstMiniObject * (*GstMiniObjectCopyFunction) (const GstMiniObject *obj); |
| 55 | /** |
| 56 | * GstMiniObjectDisposeFunction: |
| 57 | * @obj: MiniObject to dispose |
| 58 | * |
| 59 | * Function prototype for when a miniobject has lost its last refcount. |
| 60 | * Implementation of the mini object are allowed to revive the |
| 61 | * passed object by doing a gst_mini_object_ref(). If the object is not |
| 62 | * revived after the dispose function, the function should return %TRUE |
| 63 | * and the memory associated with the object is freed. |
| 64 | * |
| 65 | * Returns: %TRUE if the object should be cleaned up. |
| 66 | */ |
| 67 | typedef gboolean (*GstMiniObjectDisposeFunction) (GstMiniObject *obj); |
| 68 | /** |
| 69 | * GstMiniObjectFreeFunction: |
| 70 | * @obj: MiniObject to free |
| 71 | * |
| 72 | * Virtual function prototype for methods to free resources used by |
| 73 | * mini-objects. |
| 74 | */ |
| 75 | typedef void (*GstMiniObjectFreeFunction) (GstMiniObject *obj); |
| 76 | |
| 77 | /** |
| 78 | * GstMiniObjectNotify: |
| 79 | * @user_data: data that was provided when the notify was added |
| 80 | * @obj: the mini object |
| 81 | * |
| 82 | * A #GstMiniObjectNotify function can be added to a mini object as a |
| 83 | * callback that gets triggered when gst_mini_object_unref() drops the |
| 84 | * last ref and @obj is about to be freed. |
| 85 | */ |
| 86 | typedef void (*GstMiniObjectNotify) (gpointer user_data, GstMiniObject * obj); |
| 87 | |
| 88 | /** |
| 89 | * GST_MINI_OBJECT_TYPE: |
| 90 | * @obj: MiniObject to return type for. |
| 91 | * |
| 92 | * This macro returns the type of the mini-object. |
| 93 | */ |
| 94 | #define GST_MINI_OBJECT_TYPE(obj) (GST_MINI_OBJECT_CAST(obj)->type) |
| 95 | |
| 96 | /** |
| 97 | * GST_MINI_OBJECT_FLAGS: |
| 98 | * @obj: MiniObject to return flags for. |
| 99 | * |
| 100 | * This macro returns the entire set of flags for the mini-object. |
| 101 | */ |
| 102 | #define GST_MINI_OBJECT_FLAGS(obj) (GST_MINI_OBJECT_CAST(obj)->flags) |
| 103 | /** |
| 104 | * GST_MINI_OBJECT_FLAG_IS_SET: |
| 105 | * @obj: MiniObject to check for flags. |
| 106 | * @flag: Flag to check for |
| 107 | * |
| 108 | * This macro checks to see if the given flag is set. |
| 109 | */ |
| 110 | #define GST_MINI_OBJECT_FLAG_IS_SET(obj,flag) !!(GST_MINI_OBJECT_FLAGS (obj) & (flag)) |
| 111 | /** |
| 112 | * GST_MINI_OBJECT_FLAG_SET: |
| 113 | * @obj: MiniObject to set flag in. |
| 114 | * @flag: Flag to set, can by any number of bits in guint32. |
| 115 | * |
| 116 | * This macro sets the given bits. |
| 117 | */ |
| 118 | #define GST_MINI_OBJECT_FLAG_SET(obj,flag) (GST_MINI_OBJECT_FLAGS (obj) |= (flag)) |
| 119 | /** |
| 120 | * GST_MINI_OBJECT_FLAG_UNSET: |
| 121 | * @obj: MiniObject to unset flag in. |
| 122 | * @flag: Flag to set, must be a single bit in guint32. |
| 123 | * |
| 124 | * This macro unsets the given bits. |
| 125 | */ |
| 126 | #define GST_MINI_OBJECT_FLAG_UNSET(obj,flag) (GST_MINI_OBJECT_FLAGS (obj) &= ~(flag)) |
| 127 | |
| 128 | /** |
| 129 | * GstMiniObjectFlags: |
| 130 | * @GST_MINI_OBJECT_FLAG_LOCKABLE: the object can be locked and unlocked with |
| 131 | * gst_mini_object_lock() and gst_mini_object_unlock(). |
| 132 | * @GST_MINI_OBJECT_FLAG_LOCK_READONLY: the object is permanently locked in |
| 133 | * READONLY mode. Only read locks can be performed on the object. |
| 134 | * @GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED: the object is expected to stay alive |
| 135 | * even after gst_deinit() has been called and so should be ignored by leak |
| 136 | * detection tools. (Since: 1.10) |
| 137 | * @GST_MINI_OBJECT_FLAG_LAST: first flag that can be used by subclasses. |
| 138 | * |
| 139 | * Flags for the mini object |
| 140 | */ |
| 141 | typedef enum |
| 142 | { |
| 143 | GST_MINI_OBJECT_FLAG_LOCKABLE = (1 << 0), |
| 144 | GST_MINI_OBJECT_FLAG_LOCK_READONLY = (1 << 1), |
| 145 | GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED = (1 << 2), |
| 146 | /* padding */ |
| 147 | GST_MINI_OBJECT_FLAG_LAST = (1 << 4) |
| 148 | } GstMiniObjectFlags; |
| 149 | |
| 150 | /** |
| 151 | * GST_MINI_OBJECT_IS_LOCKABLE: |
| 152 | * @obj: a #GstMiniObject |
| 153 | * |
| 154 | * Check if @obj is lockable. A lockable object can be locked and unlocked with |
| 155 | * gst_mini_object_lock() and gst_mini_object_unlock(). |
| 156 | */ |
| 157 | #define GST_MINI_OBJECT_IS_LOCKABLE(obj) GST_MINI_OBJECT_FLAG_IS_SET(obj, GST_MINI_OBJECT_FLAG_LOCKABLE) |
| 158 | |
| 159 | /** |
| 160 | * GstLockFlags: |
| 161 | * @GST_LOCK_FLAG_READ: lock for read access |
| 162 | * @GST_LOCK_FLAG_WRITE: lock for write access |
| 163 | * @GST_LOCK_FLAG_EXCLUSIVE: lock for exclusive access |
| 164 | * @GST_LOCK_FLAG_LAST: first flag that can be used for custom purposes |
| 165 | * |
| 166 | * Flags used when locking miniobjects |
| 167 | */ |
| 168 | typedef enum { |
| 169 | GST_LOCK_FLAG_READ = (1 << 0), |
| 170 | GST_LOCK_FLAG_WRITE = (1 << 1), |
| 171 | GST_LOCK_FLAG_EXCLUSIVE = (1 << 2), |
| 172 | |
| 173 | GST_LOCK_FLAG_LAST = (1 << 8) |
| 174 | } GstLockFlags; |
| 175 | |
| 176 | /** |
| 177 | * GST_LOCK_FLAG_READWRITE: (value 3) (type GstLockFlags) |
| 178 | * |
| 179 | * GstLockFlags value alias for GST_LOCK_FLAG_READ | GST_LOCK_FLAG_WRITE |
| 180 | */ |
| 181 | #define GST_LOCK_FLAG_READWRITE ((GstLockFlags) (GST_LOCK_FLAG_READ | GST_LOCK_FLAG_WRITE)) |
| 182 | |
| 183 | /** |
| 184 | * GST_MINI_OBJECT_REFCOUNT: |
| 185 | * @obj: a #GstMiniObject |
| 186 | * |
| 187 | * Get access to the reference count field of the mini-object. |
| 188 | */ |
| 189 | #define GST_MINI_OBJECT_REFCOUNT(obj) ((GST_MINI_OBJECT_CAST(obj))->refcount) |
| 190 | /** |
| 191 | * GST_MINI_OBJECT_REFCOUNT_VALUE: |
| 192 | * @obj: a #GstMiniObject |
| 193 | * |
| 194 | * Get the reference count value of the mini-object. |
| 195 | */ |
| 196 | #define GST_MINI_OBJECT_REFCOUNT_VALUE(obj) (g_atomic_int_get (&(GST_MINI_OBJECT_CAST(obj))->refcount)) |
| 197 | |
| 198 | /** |
| 199 | * GstMiniObject: (ref-func gst_mini_object_ref) (unref-func gst_mini_object_unref) (set-value-func g_value_set_boxed) (get-value-func g_value_get_boxed) |
| 200 | * @type: the GType of the object |
| 201 | * @refcount: atomic refcount |
| 202 | * @lockstate: atomic state of the locks |
| 203 | * @flags: extra flags. |
| 204 | * @copy: a copy function |
| 205 | * @dispose: a dispose function |
| 206 | * @free: the free function |
| 207 | * |
| 208 | * Base class for refcounted lightweight objects. |
| 209 | */ |
| 210 | struct _GstMiniObject { |
| 211 | GType type; |
| 212 | |
| 213 | /*< public >*/ /* with COW */ |
| 214 | gint refcount; |
| 215 | gint lockstate; |
| 216 | guint flags; |
| 217 | |
| 218 | GstMiniObjectCopyFunction copy; |
| 219 | GstMiniObjectDisposeFunction dispose; |
| 220 | GstMiniObjectFreeFunction free; |
| 221 | |
| 222 | /* < private > */ |
| 223 | /* Used to keep track of parents, weak ref notifies and qdata */ |
| 224 | guint priv_uint; |
| 225 | gpointer priv_pointer; |
| 226 | }; |
| 227 | |
| 228 | GST_API |
| 229 | void gst_mini_object_init (GstMiniObject *mini_object, |
| 230 | guint flags, GType type, |
| 231 | GstMiniObjectCopyFunction copy_func, |
| 232 | GstMiniObjectDisposeFunction dispose_func, |
| 233 | GstMiniObjectFreeFunction free_func); |
| 234 | |
| 235 | |
| 236 | /* refcounting */ |
| 237 | |
| 238 | GST_API |
| 239 | GstMiniObject * gst_mini_object_ref (GstMiniObject *mini_object); |
| 240 | |
| 241 | GST_API |
| 242 | void gst_mini_object_unref (GstMiniObject *mini_object); |
| 243 | |
| 244 | GST_API |
| 245 | void gst_clear_mini_object (GstMiniObject **object_ptr); |
| 246 | #define gst_clear_mini_object(object_ptr) g_clear_pointer ((object_ptr), gst_mini_object_unref) |
| 247 | |
| 248 | GST_API |
| 249 | void gst_mini_object_weak_ref (GstMiniObject *object, |
| 250 | GstMiniObjectNotify notify, |
| 251 | gpointer data); |
| 252 | GST_API |
| 253 | void gst_mini_object_weak_unref (GstMiniObject *object, |
| 254 | GstMiniObjectNotify notify, |
| 255 | gpointer data); |
| 256 | |
| 257 | /* locking */ |
| 258 | |
| 259 | GST_API |
| 260 | gboolean gst_mini_object_lock (GstMiniObject *object, GstLockFlags flags); |
| 261 | |
| 262 | GST_API |
| 263 | void gst_mini_object_unlock (GstMiniObject *object, GstLockFlags flags); |
| 264 | |
| 265 | GST_API |
| 266 | gboolean gst_mini_object_is_writable (const GstMiniObject *mini_object); |
| 267 | |
| 268 | GST_API |
| 269 | GstMiniObject * gst_mini_object_make_writable (GstMiniObject *mini_object) G_GNUC_WARN_UNUSED_RESULT; |
| 270 | |
| 271 | /* copy */ |
| 272 | |
| 273 | GST_API |
| 274 | GstMiniObject * gst_mini_object_copy (const GstMiniObject *mini_object) G_GNUC_MALLOC G_GNUC_WARN_UNUSED_RESULT; |
| 275 | |
| 276 | |
| 277 | GST_API |
| 278 | void gst_mini_object_set_qdata (GstMiniObject *object, GQuark quark, |
| 279 | gpointer data, GDestroyNotify destroy); |
| 280 | GST_API |
| 281 | gpointer gst_mini_object_get_qdata (GstMiniObject *object, GQuark quark); |
| 282 | |
| 283 | GST_API |
| 284 | gpointer gst_mini_object_steal_qdata (GstMiniObject *object, GQuark quark); |
| 285 | |
| 286 | GST_API |
| 287 | void gst_mini_object_add_parent (GstMiniObject *object, GstMiniObject *parent); |
| 288 | GST_API |
| 289 | void gst_mini_object_remove_parent (GstMiniObject *object, GstMiniObject *parent); |
| 290 | |
| 291 | GST_API |
| 292 | gboolean gst_mini_object_replace (GstMiniObject **olddata, GstMiniObject *newdata); |
| 293 | |
| 294 | GST_API |
| 295 | gboolean gst_mini_object_take (GstMiniObject **olddata, GstMiniObject *newdata); |
| 296 | |
| 297 | GST_API |
| 298 | GstMiniObject * gst_mini_object_steal (GstMiniObject **olddata) G_GNUC_WARN_UNUSED_RESULT; |
| 299 | |
| 300 | /** |
| 301 | * GST_DEFINE_MINI_OBJECT_TYPE: |
| 302 | * @TypeName: name of the new type in CamelCase |
| 303 | * @type_name: name of the new type |
| 304 | * |
| 305 | * Define a new mini-object type with the given name |
| 306 | */ |
| 307 | #define GST_DEFINE_MINI_OBJECT_TYPE(TypeName,type_name) \ |
| 308 | G_DEFINE_BOXED_TYPE(TypeName,type_name, \ |
| 309 | (GBoxedCopyFunc) gst_mini_object_ref, \ |
| 310 | (GBoxedFreeFunc) gst_mini_object_unref) |
| 311 | |
| 312 | G_END_DECLS |
| 313 | |
| 314 | #endif |
| 315 | |
| 316 | |