summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_synch.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/kern/kern_synch.c')
-rw-r--r--sys/kern/kern_synch.c13
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;