diff options
Diffstat (limited to 'sys/kern/kern_synch.c')
-rw-r--r-- | sys/kern/kern_synch.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/sys/kern/kern_synch.c b/sys/kern/kern_synch.c index b476a6b4253..fe616fdfbfe 100644 --- a/sys/kern/kern_synch.c +++ b/sys/kern/kern_synch.c @@ -818,6 +818,19 @@ refcnt_take(struct refcnt *r) } int +refcnt_take_if_gt(struct refcnt *r, u_int n) +{ + u_int old; + while (1) { + old = READ_ONCE(r->refs); + if (old <= n) + return 0; + if (atomic_cas_uint(&r->refs, old, old + 1) == old) + return 1; + } +} + +int refcnt_rele(struct refcnt *r) { u_int refcnt; |