Add a urcu_ref_get_safe API, which returns a boolean. It takes the value
"false" if a LONG_MAX overflow would occur (get is not performed in this
case), or true otherwise.
It warns the user (at compile-time) if the return value is unchecked.
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
urcu_ref_set(ref, 1);
}
-static inline void urcu_ref_get(struct urcu_ref *ref)
+static inline bool __attribute__((warn_unused_result))
+ urcu_ref_get_safe(struct urcu_ref *ref)
{
long old, _new, res;
old = uatomic_read(&ref->refcount);
for (;;) {
if (old == LONG_MAX) {
- abort();
+ return false; /* Failure. */
}
_new = old + 1;
res = uatomic_cmpxchg(&ref->refcount, old, _new);
if (res == old) {
- return;
+ return true; /* Success. */
}
old = res;
}
}
+static inline void urcu_ref_get(struct urcu_ref *ref)
+{
+ if (!urcu_ref_get_safe(ref))
+ abort();
+}
+
static inline void urcu_ref_put(struct urcu_ref *ref,
void (*release)(struct urcu_ref *))
{