X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=include%2Fbabeltrace%2Fref-internal.h;h=c5d8143a61caa1ac0202ffb379afe9337c5a4291;hb=20ccd9e16883d4adf91b944a1240d7f4c931aa9a;hp=224e9229fdb787bb2373ae33ff0b1d959a9d5e84;hpb=83509119a945fc77faff869daaf48627e1c4b3fa;p=babeltrace.git diff --git a/include/babeltrace/ref-internal.h b/include/babeltrace/ref-internal.h index 224e9229..c5d8143a 100644 --- a/include/babeltrace/ref-internal.h +++ b/include/babeltrace/ref-internal.h @@ -34,7 +34,7 @@ struct bt_object; typedef void (*bt_object_release_func)(struct bt_object *); struct bt_ref { - long count; + unsigned long count; bt_object_release_func release; }; @@ -50,7 +50,14 @@ static inline void bt_ref_get(struct bt_ref *ref) { assert(ref); + + if (unlikely(!ref->release)) { + return; + } + ref->count++; + /* Overflow check. */ + assert(ref->count); } static inline @@ -58,8 +65,7 @@ void bt_ref_put(struct bt_ref *ref) { assert(ref); /* Only assert if the object has opted-in for reference counting. */ - assert(!ref->release || ref->count > 0); - if ((--ref->count) == 0 && ref->release) { + if (unlikely((--ref->count) == 0 && ref->release)) { ref->release((struct bt_object *) ref); } }