45#ifndef __LINUX_REFCOUNT_H__
46#define __LINUX_REFCOUNT_H__
58#include <linux/stddef.h>
61#define REFCOUNT_INIT(n) { .refs = ATOMIC_INIT(n), }
62#define REFCOUNT_MAX 0x7fffffff
70#define REFCOUNT_SATURATED ((int)0xc0000000)
95static inline void refcount_set(
refcount_t *r,
int n)
97 atomic_set(&r->
refs, n);
106static inline unsigned int refcount_read(
const refcount_t *r)
108 return (
unsigned int)atomic_read(&r->
refs);
127 int old = atomic_read(&r->
refs);
132 }
while (atomic_cmpxchg(&r->
refs, old, old + i) != old);
137 if (old < 0 || old + i < 0)
154 return __refcount_add_not_zero(i, r,
NULL);
167 return __refcount_add_not_zero(1, r,
NULL);
179static inline void __refcount_add(
int i,
refcount_t *r,
int *oldp)
181 int old = atomic_add_return(i, &r->
refs) - i;
188 else if (old < 0 || old + i < 0)
199static inline void refcount_add(
int i,
refcount_t *r)
201 __refcount_add(i, r,
NULL);
212 __refcount_add(1, r,
NULL);
227 int old = atomic_sub_return(i, &r->
refs) + i;
232 if (old > 0 && old == i)
235 if (old <= 0 || old - i < 0)
252 return __refcount_sub_and_test(i, r,
NULL);
265 return __refcount_sub_and_test(1, r,
NULL);
278 __refcount_sub_and_test(1, r,
NULL);
XETime t
Definition main.cpp:53
#define NULL
Definition actypes.h:561
#define __must_check
Definition compiler.h:114
void refcount_warn_saturate(refcount_t *r, enum refcount_saturation_type t)
refcount_saturation_type
Definition refcount.h:72
@ REFCOUNT_DEC_LEAK
Definition refcount.h:77
@ REFCOUNT_ADD_UAF
Definition refcount.h:75
@ REFCOUNT_ADD_NOT_ZERO_OVF
Definition refcount.h:73
@ REFCOUNT_ADD_OVF
Definition refcount.h:74
@ REFCOUNT_SUB_UAF
Definition refcount.h:76
Definition refcount_types.h:27
atomic_t refs
Definition refcount_types.h:28