70 int64_t refcount_remove(refcount_t *rc, void *holder_tag);
71 int64_t refcount_add_many(refcount_t *rc, uint64_t number, void *holder_tag);
72 int64_t refcount_remove_many(refcount_t *rc, uint64_t number, void *holder_tag);
73 void refcount_transfer(refcount_t *dst, refcount_t *src);
74
75 void refcount_init(void);
76 void refcount_fini(void);
77
78 #else /* ZFS_DEBUG */
79
80 typedef struct refcount {
81 uint64_t rc_count;
82 } refcount_t;
83
84 #define refcount_create(rc) ((rc)->rc_count = 0)
85 #define refcount_create_untracked(rc) ((rc)->rc_count = 0)
86 #define refcount_destroy(rc) ((rc)->rc_count = 0)
87 #define refcount_destroy_many(rc, number) ((rc)->rc_count = 0)
88 #define refcount_is_zero(rc) ((rc)->rc_count == 0)
89 #define refcount_count(rc) ((rc)->rc_count)
90 #define refcount_add(rc, holder) atomic_add_64_nv(&(rc)->rc_count, 1)
91 #define refcount_remove(rc, holder) atomic_add_64_nv(&(rc)->rc_count, -1)
92 #define refcount_add_many(rc, number, holder) \
93 atomic_add_64_nv(&(rc)->rc_count, number)
94 #define refcount_remove_many(rc, number, holder) \
95 atomic_add_64_nv(&(rc)->rc_count, -number)
96 #define refcount_transfer(dst, src) { \
97 uint64_t __tmp = (src)->rc_count; \
98 atomic_add_64(&(src)->rc_count, -__tmp); \
99 atomic_add_64(&(dst)->rc_count, __tmp); \
100 }
101
102 #define refcount_init()
103 #define refcount_fini()
104
105 #endif /* ZFS_DEBUG */
106
107 #ifdef __cplusplus
108 }
109 #endif
110
111 #endif /* _SYS_REFCOUNT_H */
|
70 int64_t refcount_remove(refcount_t *rc, void *holder_tag);
71 int64_t refcount_add_many(refcount_t *rc, uint64_t number, void *holder_tag);
72 int64_t refcount_remove_many(refcount_t *rc, uint64_t number, void *holder_tag);
73 void refcount_transfer(refcount_t *dst, refcount_t *src);
74
75 void refcount_init(void);
76 void refcount_fini(void);
77
78 #else /* ZFS_DEBUG */
79
80 typedef struct refcount {
81 uint64_t rc_count;
82 } refcount_t;
83
84 #define refcount_create(rc) ((rc)->rc_count = 0)
85 #define refcount_create_untracked(rc) ((rc)->rc_count = 0)
86 #define refcount_destroy(rc) ((rc)->rc_count = 0)
87 #define refcount_destroy_many(rc, number) ((rc)->rc_count = 0)
88 #define refcount_is_zero(rc) ((rc)->rc_count == 0)
89 #define refcount_count(rc) ((rc)->rc_count)
90 #define refcount_add(rc, holder) atomic_inc_64_nv(&(rc)->rc_count)
91 #define refcount_remove(rc, holder) atomic_dec_64_nv(&(rc)->rc_count)
92 #define refcount_add_many(rc, number, holder) \
93 atomic_add_64_nv(&(rc)->rc_count, number)
94 #define refcount_remove_many(rc, number, holder) \
95 atomic_add_64_nv(&(rc)->rc_count, -number)
96 #define refcount_transfer(dst, src) { \
97 uint64_t __tmp = (src)->rc_count; \
98 atomic_add_64(&(src)->rc_count, -__tmp); \
99 atomic_add_64(&(dst)->rc_count, __tmp); \
100 }
101
102 #define refcount_init()
103 #define refcount_fini()
104
105 #endif /* ZFS_DEBUG */
106
107 #ifdef __cplusplus
108 }
109 #endif
110
111 #endif /* _SYS_REFCOUNT_H */
|