]>
git.ipfire.org Git - thirdparty/git.git/blob - mem-pool.c
2 * Memory Pool implementation logic.
8 #define BLOCK_GROWTH_SIZE 1024*1024 - sizeof(struct mp_block);
11 * Allocate a new mp_block and insert it after the block specified in
12 * `insert_after`. If `insert_after` is NULL, then insert block at the
13 * head of the linked list.
15 static struct mp_block
*mem_pool_alloc_block(struct mem_pool
*mem_pool
, size_t block_alloc
, struct mp_block
*insert_after
)
19 mem_pool
->pool_alloc
+= sizeof(struct mp_block
) + block_alloc
;
20 p
= xmalloc(st_add(sizeof(struct mp_block
), block_alloc
));
22 p
->next_free
= (char *)p
->space
;
23 p
->end
= p
->next_free
+ block_alloc
;
26 p
->next_block
= insert_after
->next_block
;
27 insert_after
->next_block
= p
;
29 p
->next_block
= mem_pool
->mp_block
;
30 mem_pool
->mp_block
= p
;
36 void mem_pool_init(struct mem_pool
**mem_pool
, size_t initial_size
)
38 struct mem_pool
*pool
;
43 pool
= xcalloc(1, sizeof(*pool
));
45 pool
->block_alloc
= BLOCK_GROWTH_SIZE
;
48 mem_pool_alloc_block(pool
, initial_size
, NULL
);
53 void mem_pool_discard(struct mem_pool
*mem_pool
)
55 struct mp_block
*block
, *block_to_free
;
57 while ((block
= mem_pool
->mp_block
))
59 block_to_free
= block
;
60 block
= block
->next_block
;
67 void *mem_pool_alloc(struct mem_pool
*mem_pool
, size_t len
)
69 struct mp_block
*p
= NULL
;
72 /* round up to a 'uintmax_t' alignment */
73 if (len
& (sizeof(uintmax_t) - 1))
74 len
+= sizeof(uintmax_t) - (len
& (sizeof(uintmax_t) - 1));
76 if (mem_pool
->mp_block
&&
77 mem_pool
->mp_block
->end
- mem_pool
->mp_block
->next_free
>= len
)
78 p
= mem_pool
->mp_block
;
81 if (len
>= (mem_pool
->block_alloc
/ 2))
82 return mem_pool_alloc_block(mem_pool
, len
, mem_pool
->mp_block
);
84 p
= mem_pool_alloc_block(mem_pool
, mem_pool
->block_alloc
, NULL
);
92 void *mem_pool_calloc(struct mem_pool
*mem_pool
, size_t count
, size_t size
)
94 size_t len
= st_mult(count
, size
);
95 void *r
= mem_pool_alloc(mem_pool
, len
);