]> code.delx.au - pulseaudio/blob - src/memblock.c
make the whole stuff run and clean it self up again
[pulseaudio] / src / memblock.c
1 #include <stdlib.h>
2 #include <assert.h>
3 #include <string.h>
4
5 #include "memblock.h"
6
7 struct memblock *memblock_new(size_t length) {
8 struct memblock *b = malloc(sizeof(struct memblock)+length);
9 b->type = MEMBLOCK_APPENDED;
10 b->ref = 1;
11 b->length = length;
12 b->data = b+1;
13 return b;
14 }
15
16 struct memblock *memblock_new_fixed(void *d, size_t length) {
17 struct memblock *b = malloc(sizeof(struct memblock));
18 b->type = MEMBLOCK_FIXED;
19 b->ref = 1;
20 b->length = length;
21 b->data = d;
22 return b;
23 }
24
25 struct memblock *memblock_new_dynamic(void *d, size_t length) {
26 struct memblock *b = malloc(sizeof(struct memblock));
27 b->type = MEMBLOCK_DYNAMIC;
28 b->ref = 1;
29 b->length = length;
30 b->data = d;
31 return b;
32 }
33
34 struct memblock* memblock_ref(struct memblock*b) {
35 assert(b && b->ref >= 1);
36 b->ref++;
37 return b;
38 }
39
40 void memblock_unref(struct memblock*b) {
41 assert(b && b->ref >= 1);
42 b->ref--;
43
44 if (b->ref == 0) {
45 if (b->type == MEMBLOCK_DYNAMIC)
46 free(b->data);
47 free(b);
48 }
49 }
50
51 void memblock_unref_fixed(struct memblock *b) {
52 void *d;
53
54 assert(b && b->ref >= 1);
55
56 if (b->ref == 1) {
57 memblock_unref(b);
58 return;
59 }
60
61 d = malloc(b->length);
62 assert(d);
63 memcpy(d, b->data, b->length);
64 b->data = d;
65 b->type = MEMBLOCK_DYNAMIC;
66 }
67