[lttng-dev] [RFC PATCH urcu] urcu_ref_get: API change: return boolean
Mathieu Desnoyers
mathieu.desnoyers at efficios.com
Thu Jan 21 11:45:20 EST 2016
----- On Jan 19, 2016, at 3:57 PM, Mathieu Desnoyers mathieu.desnoyers at efficios.com wrote:
> This is a RFC of a follow up patch based on urcu commit 7d7c5d467 "Fix:
> handle reference count overflow".
>
> Change the urcu_ref_get prototype to return a boolean, which takes the
> value false if a LONG_MAX overflow would occur (get has not been
> performed), or true otherwise.
>
> This interface change also introduces a "warn_unused_result" gcc
> function attribute, which will show warnings if users don't handle the
> return value.
>
> I'm wondering whether this change is useful enough to justify breaking
> the API (need to bump the major library version), or if introducing a
> new "urcu_ref_get_safe()" or such would be a better option ?
After some thinking, I will go for adding a new urcu_ref_get_safe() API,
thus not requiring to bump the library major version.
Thanks,
Mathieu
>
> Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers at efficios.com>
> CC: Paul E. McKenney <paulmck at linux.vnet.ibm.com>
> CC: Lai Jiangshan <jiangshanlai at gmail.com>
> CC: Stephen Hemminger <stephen at networkplumber.org>
> CC: Chris Mason <clm at fb.com>
> CC: lttng-dev at lists.lttng.org
> CC: rp at svcs.cs.pdx.edu
> ---
> urcu/ref.h | 7 ++++---
> 1 file changed, 4 insertions(+), 3 deletions(-)
>
> diff --git a/urcu/ref.h b/urcu/ref.h
> index 2b803e5..42417c0 100644
> --- a/urcu/ref.h
> +++ b/urcu/ref.h
> @@ -34,19 +34,20 @@ 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(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;
> }
> --
> 2.1.4
--
Mathieu Desnoyers
EfficiOS Inc.
http://www.efficios.com
More information about the lttng-dev
mailing list