[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [RFC PATCH 04/10] xen: add reference counter support
We can use reference counter to ease up object lifetime management. This patch adds very basic support for reference counters. refcnt should be used in the following way: 1. Protected structure should have refcnt_t field 2. This field should be initialized with refcnt_init() during object construction. 3. If code holds a valid pointer to a structure/object it can increase refcount with refcnt_get(). No additional locking is required. 4. Code should call refcnt_put() before dropping pointer to a protected structure. `destructor` is a call back function that should destruct object and free all resources, including structure protected itself. Destructor will be called if reference counter reaches zero. 5. If code does not hold a valid pointer to a protected structure it should use other locking mechanism to obtain a pointer. For example, it should lock a list that hold protected objects. Signed-off-by: Volodymyr Babchuk <volodymyr_babchuk@xxxxxxxx> --- xen/include/xen/refcnt.h | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 xen/include/xen/refcnt.h diff --git a/xen/include/xen/refcnt.h b/xen/include/xen/refcnt.h new file mode 100644 index 0000000000..7f5395a21c --- /dev/null +++ b/xen/include/xen/refcnt.h @@ -0,0 +1,28 @@ +#ifndef __XEN_REFCNT_H__ +#define __XEN_REFCNT_H__ + +#include <asm/atomic.h> + +typedef atomic_t refcnt_t; + +static inline void refcnt_init(refcnt_t *refcnt) +{ + atomic_set(refcnt, 1); +} + +static inline void refcnt_get(refcnt_t *refcnt) +{ +#ifndef NDEBUG + ASSERT(atomic_add_unless(refcnt, 1, 0) > 0); +#else + atomic_add_unless(refcnt, 1, 0); +#endif +} + +static inline void refcnt_put(refcnt_t *refcnt, void (*destructor)(refcnt_t *refcnt)) +{ + if ( atomic_dec_and_test(refcnt) ) + destructor(refcnt); +} + +#endif -- 2.36.1
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |