]> Dogcows Code - chaz/homebank/blob - src/refcount.h
add plugin engine (supports C and Perl plugins)
[chaz/homebank] / src / refcount.h
1
2 #ifndef __REFCOUNT_H__
3 #define __REFCOUNT_H__
4
5 #include <glib.h>
6
7
8 static inline gpointer rc_alloc(size_t size)
9 {
10 gpointer chunk = g_malloc0(size + sizeof(long));
11 (*(long*)chunk) = 1;
12 //g_print("ALLOC: %p (ref %ld)\n", (long*)chunk + 1, *(long*)chunk);
13 return (long*)chunk + 1;
14 }
15
16 static inline gpointer rc_ref(gpointer p)
17 {
18 //g_print(" REF: %p (ref %ld)\n", p, *((long*)p - 1));
19 if (p) {
20 ++(*((long*)p - 1));
21 }
22 return p;
23 }
24
25 static inline gboolean rc_unref(gpointer p)
26 {
27 //g_print("UNREF: %p (ref %ld)\n", p, *((long*)p - 1));
28 if (p && --(*((long*)p - 1)) <= 0) {
29 return TRUE;
30 }
31 return FALSE;
32 }
33
34 static inline void rc_free(gpointer p)
35 {
36 //g_print(" FREE: %p (ref %ld)\n", p, *((long*)p - 1));
37 g_free((long*)p - 1);
38 }
39
40 static inline gpointer rc_dup(gpointer p, size_t size)
41 {
42 if (p) {
43 gpointer chunk = (long*)p - 1;
44 gpointer new_chunk = g_memdup(chunk, size + sizeof(long));
45 *(long*)new_chunk = 1;
46 //g_print(" DUP: %p (ref %ld) -> %p (ref %ld)\n", p, *((long*)p - 1), (long*)new_chunk + 1, *(long*)new_chunk);
47 return (long*)new_chunk + 1;
48 }
49 //g_print(" DUP: NULL\n");
50 return NULL;
51 }
52
53
54 #endif
This page took 0.035204 seconds and 4 git commands to generate.