urcu_ref_get_safe: introduce new API
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Thu, 21 Jan 2016 16:45:58 +0000 (11:45 -0500)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Thu, 21 Jan 2016 16:47:27 +0000 (11:47 -0500)
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.h

index 2b803e5b68e4710606df29f128ff7f1637dc1472..e546da567120e086e5773950ac135d510900b4fc 100644 (file)
@@ -34,24 +34,31 @@ static inline void urcu_ref_init(struct urcu_ref *ref)
        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 *))
 {
This page took 0.025729 seconds and 4 git commands to generate.