#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;
+ unsigned 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++;
+
+ if (unlikely(!ref->release)) {
+ return;
+ }
+
+ ref->count++;
+ /* Overflow check. */
+ assert(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. */
+ if (unlikely((--ref->count) == 0 && ref->release)) {
+ ref->release((struct bt_object *) ref);
}
}