]> git.lizzy.rs Git - dragonstd.git/blob - refcount.c
Use proper format for size_t printf
[dragonstd.git] / refcount.c
1 #include "bits/callback.h" // for SingleCallback
2 #include "refcount.h"
3
4 void refcount_ini(Refcount *refcount, void *obj, void *del)
5 {
6         refcount->obj = obj;
7         refcount->del = del;
8         refcount->cnt = 1;
9         pthread_mutex_init(&refcount->mtx, NULL);
10 }
11
12 void refcount_dst(Refcount *refcount)
13 {
14         pthread_mutex_destroy(&refcount->mtx);
15 }
16
17 void *refcount_inc(Refcount *refcount)
18 {
19         pthread_mutex_lock(&refcount->mtx);
20         refcount->cnt++;
21         pthread_mutex_unlock(&refcount->mtx);
22         return refcount;
23 }
24
25 void *refcount_grb(Refcount *refcount)
26 {
27         return refcount_obj(refcount_inc(refcount));
28 }
29
30 void refcount_drp(Refcount *refcount)
31 {
32         pthread_mutex_lock(&refcount->mtx);
33         unsigned short count = --refcount->cnt;
34         pthread_mutex_unlock(&refcount->mtx);
35
36         if (!count)
37                 ((SingleCallback) refcount->del)(refcount->obj);
38 }
39
40 void *refcount_obj(Refcount *refcount)
41 {
42         return refcount->obj;
43 }