X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=blobdiff_plain;f=include%2Fbabeltrace%2Fref-internal.h;h=224e9229fdb787bb2373ae33ff0b1d959a9d5e84;hp=a8eec330ab25411f5c09fdee430a026d7f948f1b;hb=83509119a945fc77faff869daaf48627e1c4b3fa;hpb=4841ccc167f5f99267a0c129a1e79214b60f553c diff --git a/include/babeltrace/ref-internal.h b/include/babeltrace/ref-internal.h index a8eec330..224e9229 100644 --- a/include/babeltrace/ref-internal.h +++ b/include/babeltrace/ref-internal.h @@ -2,7 +2,7 @@ #define BABELTRACE_REF_INTERNAL_H /* - * Babeltrace - reference counting + * Babeltrace - Reference Counting * * Copyright 2013, 2014 Jérémie Galarneau * @@ -27,40 +27,40 @@ * SOFTWARE. */ +#include #include -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); } }