2dfa6a9c1bddda47eb034766087e3fe0734a37ec
[profile/ivi/pulseaudio.git] / src / memblock.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <assert.h>
4 #include <string.h>
5
6 #include "memblock.h"
7
8 unsigned pa_memblock_count = 0, pa_memblock_total = 0;
9
10 struct pa_memblock *pa_memblock_new(size_t length) {
11     struct pa_memblock *b = malloc(sizeof(struct pa_memblock)+length);
12     b->type = PA_MEMBLOCK_APPENDED;
13     b->ref = 1;
14     b->length = length;
15     b->data = b+1;
16     pa_memblock_count++;
17     pa_memblock_total += length;
18     return b;
19 }
20
21 struct pa_memblock *pa_memblock_new_fixed(void *d, size_t length) {
22     struct pa_memblock *b = malloc(sizeof(struct pa_memblock));
23     b->type = PA_MEMBLOCK_FIXED;
24     b->ref = 1;
25     b->length = length;
26     b->data = d;
27     pa_memblock_count++;
28     pa_memblock_total += length;
29     return b;
30 }
31
32 struct pa_memblock *pa_memblock_new_dynamic(void *d, size_t length) {
33     struct pa_memblock *b = malloc(sizeof(struct pa_memblock));
34     b->type = PA_MEMBLOCK_DYNAMIC;
35     b->ref = 1;
36     b->length = length;
37     b->data = d;
38     pa_memblock_count++;
39     pa_memblock_total += length;
40     return b;
41 }
42
43 struct pa_memblock* pa_memblock_ref(struct pa_memblock*b) {
44     assert(b && b->ref >= 1);
45     b->ref++;
46     return b;
47 }
48
49 void pa_memblock_unref(struct pa_memblock*b) {
50     assert(b && b->ref >= 1);
51     b->ref--;
52
53     if (b->ref == 0) {
54         if (b->type == PA_MEMBLOCK_DYNAMIC)
55             free(b->data);
56
57         pa_memblock_count--;
58         pa_memblock_total -= b->length;
59
60         free(b);
61     }
62 }
63
64 void pa_memblock_unref_fixed(struct pa_memblock *b) {
65     void *d;
66     
67     assert(b && b->ref >= 1);
68
69     if (b->ref == 1) {
70         pa_memblock_unref(b);
71         return;
72     } else {
73         d = malloc(b->length);
74         assert(d);
75         memcpy(d, b->data, b->length);
76         b->data = d;
77         b->type = PA_MEMBLOCK_DYNAMIC;
78         b->ref--;
79     }
80 }
81