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 <[email protected]> --- 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
