123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- #ifndef REF_COUNT_H
- #define REF_COUNT_H
- #pragma once
- #include <winpr/wtypes.h>
- #include <winpr/interlocked.h> /*for warning: implicit declaration of function InterlockedIncrement*/
- #ifdef __cplusplus
- extern "C" {
- #endif
- #define __REF_COUNT_NOTHING
- #define __REF_COUNT_STATIC static
- typedef void (*refcnt_on_destroy)(void *inst);
- /*declare function prototype*/
- #define __DECLARE_REF_COUNT(typeprefix, type, modifier) \
- modifier int typeprefix##_inc_ref(type*); \
- modifier int typeprefix##_dec_ref(type*); \
- modifier int typeprefix##_ref_cnt(type*);
- #define DECLARE_REF_COUNT(typeprefix, type) __DECLARE_REF_COUNT(typeprefix, type, __REF_COUNT_NOTHING)
- #define DECLARE_REF_COUNT_STATIC(typeprefix, type) __DECLARE_REF_COUNT(typeprefix, type, __REF_COUNT_STATIC)
- #define DECLARE_REF_COUNT_MEMBER(member) int member
- #define REF_COUNT_INIT(ep) *(ep) = 1
- /*
- *typeprefix: function prefix declare
- *type: the object type to deal with
- *member: object's member name in refcnt type
- *free_fn: the free function to free the object pointer
- *modifer: static or not(empty)
- */
- #define __IMPLEMENT_REF_COUNT(typeprefix, type, member, free_fn, modifer) \
- modifer int typeprefix##_inc_ref(type *o) { \
- return ++((o)->member); \
- }\
- modifer int typeprefix##_dec_ref(type *o) { \
- if(--((o)->member) == 0) \
- free_fn(o); \
- return (o)->member; \
- }\
- modifer int typeprefix##_ref_cnt(type* o) { \
- return (o)->member; \
- }
- #define IMPLEMENT_REF_COUNT(typeprefix, type, member, free_fn) __IMPLEMENT_REF_COUNT(typeprefix, type, member, free_fn, __REF_COUNT_NOTHING)
- #define IMPLEMENT_REF_COUNT_STATIC(typeprefix, type, member, free_fn) __IMPLEMENT_REF_COUNT(typeprefix, type, member, free_fn, __REF_COUNT_STATIC)
- /*in case: multi thread environment*/
- #define __IMPLEMENT_REF_COUNT_MT(typeprefix, type, member, free_fn, modifier) \
- modifier int typeprefix##_inc_ref(type *o) {\
- return (int)InterlockedIncrement((LONG*)&((o)->member));\
- }\
- modifier int typeprefix##_dec_ref(type *o) { \
- int ret = InterlockedDecrement((LONG*)&(o)->member); \
- if (0 == ret) \
- free_fn(o); \
- return ret; \
- }\
- modifier int typeprefix##_ref_cnt(type* o) { \
- return (o)->member; \
- }
- #define IMPLEMENT_REF_COUNT_MT(typeprefix, type, member, free_fn) __IMPLEMENT_REF_COUNT_MT(typeprefix, type, member, free_fn, __REF_COUNT_NOTHING)
- #define IMPLEMENT_REF_COUNT_MT_STATIC(typeprefix, type, member, free_fn) __IMPLEMENT_REF_COUNT_MT(typeprefix, type, member, free_fn, __REF_COUNT_STATIC)
- #define inc_ref(type, ptr) type##_inc_ref(ptr)
- #define dec_ref(type, ptr) type##_dec_ref(ptr)
- #define ref_cnt(type, ptr) type##_ref_cnt(ptr)
- #ifdef __cplusplus
- } // extern "C" {
- #endif
- #endif // REF_COUNT_H
|