Coverage Report

Created: 2017-04-15 07:07

/home/travis/build/MoarVM/MoarVM/src/core/regionalloc.c
Line
Count
Source
1
#include "moar.h"
2
3
8.25M
void * MVM_region_alloc(MVMThreadContext *tc, MVMRegionAlloc *al, size_t bytes) {
4
8.25M
    char *result = NULL;
5
8.25M
6
8.25M
#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
8.25M
11
8.25M
    if (al->block != NULL && (al->block->alloc + bytes) < al->block->limit) {
12
8.20M
        result = al->block->alloc;
13
8.20M
        al->block->alloc += bytes;
14
42.6k
    } else {
15
42.6k
        /* No block, or block was full. Add another. */
16
42.6k
        MVMRegionBlock *block = MVM_malloc(sizeof(MVMRegionBlock));
17
42.6k
        size_t buffer_size = al->block == NULL
18
21.8k
            ? MVM_REGIONALLOC_FIRST_MEMBLOCK_SIZE
19
20.8k
            : MVM_REGIONALLOC_MEMBLOCK_SIZE;
20
42.6k
        if (buffer_size < bytes)
21
116
            buffer_size = bytes;
22
42.6k
        block->buffer = MVM_calloc(1, buffer_size);
23
42.6k
        block->alloc  = block->buffer;
24
42.6k
        block->limit  = block->buffer + buffer_size;
25
42.6k
        block->prev   = al->block;
26
42.6k
        al->block     = block;
27
42.6k
28
42.6k
        /* Now allocate out of it. */
29
42.6k
        result = block->alloc;
30
42.6k
        block->alloc += bytes;
31
42.6k
    }
32
8.25M
    return result;
33
8.25M
}
34
35
18.5k
void MVM_region_destroy(MVMThreadContext *tc, MVMRegionAlloc *alloc) {
36
18.5k
    MVMRegionBlock *block = alloc->block;
37
18.5k
    /* Free all of the allocated memory. */
38
56.1k
    while (block) {
39
37.5k
        MVMRegionBlock *prev = block->prev;
40
37.5k
        MVM_free(block->buffer);
41
37.5k
        MVM_free(block);
42
37.5k
        block = prev;
43
37.5k
    }
44
18.5k
    alloc->block = NULL;
45
18.5k
}