/home/travis/build/MoarVM/MoarVM/src/core/regionalloc.c
Line | Count | Source |
1 | | #include "moar.h" |
2 | | |
3 | 19.7M | void * MVM_region_alloc(MVMThreadContext *tc, MVMRegionAlloc *al, size_t bytes) { |
4 | 19.7M | char *result = NULL; |
5 | 19.7M | |
6 | 19.7M | #if !defined(MVM_CAN_UNALIGNED_INT64) || !defined(MVM_CAN_UNALIGNED_NUM64) |
7 | | /* Round up size to next multiple of 8, to ensure alignment. */ |
8 | | bytes = (bytes + 7) & ~7; |
9 | | #endif |
10 | 19.7M | |
11 | 19.7M | if (al->block != NULL && (al->block->alloc + bytes) < al->block->limit) { |
12 | 19.5M | result = al->block->alloc; |
13 | 19.5M | al->block->alloc += bytes; |
14 | 199k | } else { |
15 | 199k | /* No block, or block was full. Add another. */ |
16 | 199k | MVMRegionBlock *block = MVM_malloc(sizeof(MVMRegionBlock)); |
17 | 199k | size_t buffer_size = al->block == NULL |
18 | 21.1k | ? MVM_REGIONALLOC_FIRST_MEMBLOCK_SIZE |
19 | 178k | : MVM_REGIONALLOC_MEMBLOCK_SIZE; |
20 | 199k | if (buffer_size < bytes) |
21 | 70 | buffer_size = bytes; |
22 | 199k | block->buffer = MVM_calloc(1, buffer_size); |
23 | 199k | block->alloc = block->buffer; |
24 | 199k | block->limit = block->buffer + buffer_size; |
25 | 199k | block->prev = al->block; |
26 | 199k | al->block = block; |
27 | 199k | |
28 | 199k | /* Now allocate out of it. */ |
29 | 199k | result = block->alloc; |
30 | 199k | block->alloc += bytes; |
31 | 199k | } |
32 | 19.7M | return result; |
33 | 19.7M | } |
34 | | |
35 | 20.8k | void MVM_region_destroy(MVMThreadContext *tc, MVMRegionAlloc *alloc) { |
36 | 20.8k | MVMRegionBlock *block = alloc->block; |
37 | 20.8k | /* Free all of the allocated memory. */ |
38 | 206k | while (block) { |
39 | 185k | MVMRegionBlock *prev = block->prev; |
40 | 185k | MVM_free(block->buffer); |
41 | 185k | MVM_free(block); |
42 | 185k | block = prev; |
43 | 185k | } |
44 | 20.8k | alloc->block = NULL; |
45 | 20.8k | } |