10
#include "amqp_config.h"
12
char const *amqp_version(void) {
13
return VERSION; /* defined in config.h */
16
void init_amqp_pool(amqp_pool_t *pool, size_t pagesize) {
17
pool->pagesize = pagesize ? pagesize : 4096;
19
pool->pages.num_blocks = 0;
20
pool->pages.blocklist = NULL;
22
pool->large_blocks.num_blocks = 0;
23
pool->large_blocks.blocklist = NULL;
26
pool->alloc_block = NULL;
30
static void empty_blocklist(amqp_pool_blocklist_t *x) {
33
for (i = 0; i < x->num_blocks; i++) {
34
free(x->blocklist[i]);
36
if (x->blocklist != NULL) {
43
void recycle_amqp_pool(amqp_pool_t *pool) {
44
empty_blocklist(&pool->large_blocks);
46
pool->alloc_block = NULL;
50
void empty_amqp_pool(amqp_pool_t *pool) {
51
recycle_amqp_pool(pool);
52
empty_blocklist(&pool->pages);
55
static int record_pool_block(amqp_pool_blocklist_t *x, void *block) {
56
size_t blocklistlength = sizeof(void *) * (x->num_blocks + 1);
58
if (x->blocklist == NULL) {
59
x->blocklist = malloc(blocklistlength);
60
if (x->blocklist == NULL) {
64
void *newbl = realloc(x->blocklist, blocklistlength);
71
x->blocklist[x->num_blocks] = block;
76
void *amqp_pool_alloc(amqp_pool_t *pool, size_t amount) {
81
amount = (amount + 7) & (~7); /* round up to nearest 8-byte boundary */
83
if (amount > pool->pagesize) {
84
void *result = calloc(1, amount);
88
if (record_pool_block(&pool->large_blocks, result) != 0) {
94
if (pool->alloc_block != NULL) {
95
assert(pool->alloc_used <= pool->pagesize);
97
if (pool->alloc_used + amount <= pool->pagesize) {
98
void *result = pool->alloc_block + pool->alloc_used;
99
pool->alloc_used += amount;
104
if (pool->next_page >= pool->pages.num_blocks) {
105
pool->alloc_block = calloc(1, pool->pagesize);
106
if (pool->alloc_block == NULL) {
109
if (record_pool_block(&pool->pages, pool->alloc_block) != 0) {
112
pool->next_page = pool->pages.num_blocks;
114
pool->alloc_block = pool->pages.blocklist[pool->next_page];
118
pool->alloc_used = amount;
120
return pool->alloc_block;
123
void amqp_pool_alloc_bytes(amqp_pool_t *pool, size_t amount, amqp_bytes_t *output) {
124
output->len = amount;
125
output->bytes = amqp_pool_alloc(pool, amount);
128
amqp_bytes_t amqp_cstring_bytes(char const *cstr) {
130
result.len = strlen(cstr);
131
result.bytes = (void *) cstr;
135
amqp_bytes_t amqp_bytes_malloc_dup(amqp_bytes_t src) {
137
result.len = src.len;
138
result.bytes = malloc(src.len);
139
if (result.bytes != NULL) {
140
memcpy(result.bytes, src.bytes, src.len);