Coverage Report

Created: 2018-07-03 15:31

/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
}