--- /dev/null
+#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;
+}