2004-07-16 19:16:42 +00:00
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
|
#include <config.h>
|
|
|
|
|
#endif
|
|
|
|
|
|
2004-06-15 15:18:33 +00:00
|
|
|
#include <stdio.h>
|
2004-06-08 23:54:24 +00:00
|
|
|
#include <stdlib.h>
|
|
|
|
|
#include <assert.h>
|
|
|
|
|
#include <string.h>
|
|
|
|
|
|
|
|
|
|
#include "memblock.h"
|
|
|
|
|
|
2004-07-15 20:12:21 +00:00
|
|
|
static unsigned memblock_count = 0, memblock_total = 0;
|
2004-06-15 15:18:33 +00:00
|
|
|
|
2004-07-03 23:35:12 +00:00
|
|
|
struct pa_memblock *pa_memblock_new(size_t length) {
|
|
|
|
|
struct pa_memblock *b = malloc(sizeof(struct pa_memblock)+length);
|
|
|
|
|
b->type = PA_MEMBLOCK_APPENDED;
|
2004-06-08 23:54:24 +00:00
|
|
|
b->ref = 1;
|
|
|
|
|
b->length = length;
|
|
|
|
|
b->data = b+1;
|
2004-07-15 20:12:21 +00:00
|
|
|
memblock_count++;
|
|
|
|
|
memblock_total += length;
|
2004-06-08 23:54:24 +00:00
|
|
|
return b;
|
|
|
|
|
}
|
|
|
|
|
|
2004-07-03 23:35:12 +00:00
|
|
|
struct pa_memblock *pa_memblock_new_fixed(void *d, size_t length) {
|
|
|
|
|
struct pa_memblock *b = malloc(sizeof(struct pa_memblock));
|
|
|
|
|
b->type = PA_MEMBLOCK_FIXED;
|
2004-06-08 23:54:24 +00:00
|
|
|
b->ref = 1;
|
|
|
|
|
b->length = length;
|
|
|
|
|
b->data = d;
|
2004-07-15 20:12:21 +00:00
|
|
|
memblock_count++;
|
|
|
|
|
memblock_total += length;
|
2004-06-08 23:54:24 +00:00
|
|
|
return b;
|
|
|
|
|
}
|
|
|
|
|
|
2004-07-03 23:35:12 +00:00
|
|
|
struct pa_memblock *pa_memblock_new_dynamic(void *d, size_t length) {
|
|
|
|
|
struct pa_memblock *b = malloc(sizeof(struct pa_memblock));
|
|
|
|
|
b->type = PA_MEMBLOCK_DYNAMIC;
|
2004-06-08 23:54:24 +00:00
|
|
|
b->ref = 1;
|
|
|
|
|
b->length = length;
|
|
|
|
|
b->data = d;
|
2004-07-15 20:12:21 +00:00
|
|
|
memblock_count++;
|
|
|
|
|
memblock_total += length;
|
2004-06-08 23:54:24 +00:00
|
|
|
return b;
|
|
|
|
|
}
|
|
|
|
|
|
2004-07-03 23:35:12 +00:00
|
|
|
struct pa_memblock* pa_memblock_ref(struct pa_memblock*b) {
|
2004-06-08 23:54:24 +00:00
|
|
|
assert(b && b->ref >= 1);
|
|
|
|
|
b->ref++;
|
|
|
|
|
return b;
|
|
|
|
|
}
|
|
|
|
|
|
2004-07-03 23:35:12 +00:00
|
|
|
void pa_memblock_unref(struct pa_memblock*b) {
|
2004-06-08 23:54:24 +00:00
|
|
|
assert(b && b->ref >= 1);
|
|
|
|
|
b->ref--;
|
|
|
|
|
|
|
|
|
|
if (b->ref == 0) {
|
2004-07-03 23:35:12 +00:00
|
|
|
if (b->type == PA_MEMBLOCK_DYNAMIC)
|
2004-06-08 23:54:24 +00:00
|
|
|
free(b->data);
|
2004-06-18 17:12:50 +00:00
|
|
|
|
2004-07-15 20:12:21 +00:00
|
|
|
memblock_count--;
|
|
|
|
|
memblock_total -= b->length;
|
2004-06-18 17:12:50 +00:00
|
|
|
|
2004-06-08 23:54:24 +00:00
|
|
|
free(b);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2004-07-03 23:35:12 +00:00
|
|
|
void pa_memblock_unref_fixed(struct pa_memblock *b) {
|
2004-06-08 23:54:24 +00:00
|
|
|
void *d;
|
|
|
|
|
|
|
|
|
|
assert(b && b->ref >= 1);
|
|
|
|
|
|
|
|
|
|
if (b->ref == 1) {
|
2004-07-03 23:35:12 +00:00
|
|
|
pa_memblock_unref(b);
|
2004-06-08 23:54:24 +00:00
|
|
|
return;
|
2004-07-10 16:50:22 +00:00
|
|
|
} else {
|
|
|
|
|
d = malloc(b->length);
|
|
|
|
|
assert(d);
|
|
|
|
|
memcpy(d, b->data, b->length);
|
|
|
|
|
b->data = d;
|
|
|
|
|
b->type = PA_MEMBLOCK_DYNAMIC;
|
|
|
|
|
b->ref--;
|
2004-06-08 23:54:24 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2004-07-15 20:12:21 +00:00
|
|
|
unsigned pa_memblock_get_count(void) {
|
|
|
|
|
return memblock_count;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
unsigned pa_memblock_get_total(void) {
|
|
|
|
|
return memblock_total;
|
|
|
|
|
}
|