X-Git-Url: http://git.liburcu.org/?p=urcu.git;a=blobdiff_plain;f=urcu%2Fref.h;h=e546da567120e086e5773950ac135d510900b4fc;hp=2b803e5b68e4710606df29f128ff7f1637dc1472;hb=8b4b5a1a5f8587cb995391e4f49d03674ec60c0c;hpb=7ce99d0278e87880d1382cdf791bb84f7b489ea4 diff --git a/urcu/ref.h b/urcu/ref.h index 2b803e5..e546da5 100644 --- a/urcu/ref.h +++ b/urcu/ref.h @@ -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 *)) {