aboutsummaryrefslogtreecommitdiff
path: root/src/core/refcnt.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/refcnt.c')
-rw-r--r--src/core/refcnt.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/src/core/refcnt.c b/src/core/refcnt.c
new file mode 100644
index 00000000..1b119507
--- /dev/null
+++ b/src/core/refcnt.c
@@ -0,0 +1,33 @@
+// Copyright 2024 Staysail Systems, Inc. <info@staysail.tech>
+//
+// This software is supplied under the terms of the MIT License, a
+// copy of which should be located in the distribution where this
+// file was obtained (LICENSE.txt). A copy of the license may also be
+// found online at https://opensource.org/licenses/MIT.
+//
+
+#include <core/refcnt.h>
+
+void
+nni_refcnt_init(
+ nni_refcnt *rc, unsigned value, void *data, void (*fini)(void *))
+{
+ nni_atomic_init(&rc->rc_cnt);
+ nni_atomic_set(&rc->rc_cnt, value);
+ rc->rc_data = data;
+ rc->rc_fini = fini;
+}
+
+void
+nni_refcnt_hold(nni_refcnt *rc)
+{
+ nni_atomic_inc(&rc->rc_cnt);
+}
+
+void
+nni_refcnt_rele(nni_refcnt *rc)
+{
+ if (nni_atomic_dec_nv(&rc->rc_cnt) == 0) {
+ rc->rc_fini(rc->rc_data);
+ }
+}