X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=urcu%2Furcu_ref.h;fp=urcu%2Furcu_ref.h;h=bce711619a8b77dfb5795e5aee8421964d6028ac;hb=453629a9317adef5b96c3d55e4dcd98db680997a;hp=0000000000000000000000000000000000000000;hpb=e90ad78457151a8faec9d77934b292f458082386;p=urcu.git diff --git a/urcu/urcu_ref.h b/urcu/urcu_ref.h new file mode 100644 index 0000000..bce7116 --- /dev/null +++ b/urcu/urcu_ref.h @@ -0,0 +1,47 @@ +#ifndef _URCU_REF_H +#define _URCU_REF_H + +/* + * Userspace RCU - Reference counting + * + * Copyright (C) 2009 Novell Inc. + * Copyright (C) 2010 Mathieu Desnoyers + * + * Author: Jan Blunck + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License version 2.1 as + * published by the Free Software Foundation. + */ + +#include +#include + +struct urcu_ref { + long refcount; /* ATOMIC */ +}; + +static inline void urcu_ref_set(struct urcu_ref *ref, long val) +{ + uatomic_set(&ref->refcount, val); +} + +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) +{ + long res = uatomic_add_return(&ref->refcount, 1); + assert(res != 0); +} + +static inline void urcu_ref_put(struct urcu_ref *ref, + void (*release)(struct urcu_ref *)) +{ + if (!uatomic_sub_return(&ref->refcount, 1)) + release(ref); +} + +#endif /* _URCU_REF_H */