]> git.lizzy.rs Git - dragonstd.git/blobdiff - dragonstd/refcount.c
Add CMake config
[dragonstd.git] / dragonstd / refcount.c
diff --git a/dragonstd/refcount.c b/dragonstd/refcount.c
new file mode 100644 (file)
index 0000000..95d896b
--- /dev/null
@@ -0,0 +1,43 @@
+#include "bits/callback.h" // for SingleCallback
+#include "refcount.h"
+
+void refcount_ini(Refcount *refcount, void *obj, void *del)
+{
+       refcount->obj = obj;
+       refcount->del = del;
+       refcount->cnt = 1;
+       pthread_mutex_init(&refcount->mtx, NULL);
+}
+
+void refcount_dst(Refcount *refcount)
+{
+       pthread_mutex_destroy(&refcount->mtx);
+}
+
+void *refcount_inc(Refcount *refcount)
+{
+       pthread_mutex_lock(&refcount->mtx);
+       refcount->cnt++;
+       pthread_mutex_unlock(&refcount->mtx);
+       return refcount;
+}
+
+void *refcount_grb(Refcount *refcount)
+{
+       return refcount_obj(refcount_inc(refcount));
+}
+
+void refcount_drp(Refcount *refcount)
+{
+       pthread_mutex_lock(&refcount->mtx);
+       unsigned short count = --refcount->cnt;
+       pthread_mutex_unlock(&refcount->mtx);
+
+       if (!count)
+               ((SingleCallback) refcount->del)(refcount->obj);
+}
+
+void *refcount_obj(Refcount *refcount)
+{
+       return refcount->obj;
+}