Unify reference counting using a common bt_object base
[babeltrace.git] / include / babeltrace / ref-internal.h
index a8eec330ab25411f5c09fdee430a026d7f948f1b..224e9229fdb787bb2373ae33ff0b1d959a9d5e84 100644 (file)
@@ -2,7 +2,7 @@
 #define BABELTRACE_REF_INTERNAL_H
 
 /*
- * Babeltrace - reference counting
+ * Babeltrace - Reference Counting
  *
  * Copyright 2013, 2014 Jérémie Galarneau <jeremie.galarneau@efficios.com>
  *
  * SOFTWARE.
  */
 
+#include <babeltrace/babeltrace-internal.h>
 #include <assert.h>
 
-struct bt_ref;
-
-typedef void (*bt_ref_release_func_t)(struct bt_ref *);
+struct bt_object;
+typedef void (*bt_object_release_func)(struct bt_object *);
 
 struct bt_ref {
-       long refcount;
-       bt_ref_release_func_t release_func;
+       long count;
+       bt_object_release_func release;
 };
 
 static inline
-void bt_ref_init(struct bt_ref *ref,
-       bt_ref_release_func_t release_func)
+void bt_ref_init(struct bt_ref *ref, bt_object_release_func release)
 {
        assert(ref);
-       ref->refcount = 1;
-       ref->release_func = release_func;
+       ref->count = 1;
+       ref->release = release;
 }
 
 static inline
 void bt_ref_get(struct bt_ref *ref)
 {
        assert(ref);
-       ref->refcount++;
+       ref->count++;
 }
 
 static inline
 void bt_ref_put(struct bt_ref *ref)
 {
        assert(ref);
-       assert(ref->release_func);
-       if ((--ref->refcount) == 0) {
-               ref->release_func(ref);
+       /* Only assert if the object has opted-in for reference counting. */
+       assert(!ref->release || ref->count > 0);
+       if ((--ref->count) == 0 && ref->release) {
+               ref->release((struct bt_object *) ref);
        }
 }
 
This page took 0.023294 seconds and 4 git commands to generate.