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