aboutsummaryrefslogtreecommitdiff
path: root/runtime/src/shed/memory.c
blob: 8ed05f3827f14e73c107612cee4b49da67001659 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include "./memory.h"

#ifdef __wasm__

const intptr_t PAGE_SIZE = 65536;

void* shed__runtime__memory_init(intptr_t alignment) {
    return (void*) (__builtin_wasm_memory_size(0) * PAGE_SIZE);
}

void* shed__runtime__memory_grow(intptr_t increment) {
    if (increment % PAGE_SIZE != 0) {
        increment += PAGE_SIZE - (increment % PAGE_SIZE);
    }

    return (void*) (__builtin_wasm_memory_grow(0, increment / PAGE_SIZE) * PAGE_SIZE);
}

#else

#include <unistd.h>

void* shed__runtime__memory_init(intptr_t alignment) {
    void* ptr = sbrk(0);

    intptr_t remainder = (intptr_t) ptr % alignment;
    if (remainder != 0) {
        intptr_t increment = alignment - remainder;
        // TODO: check for -1 from sbrk
        sbrk(increment);

        // TODO: assert alignment is correct
        ptr += increment;
    }

    return ptr;
}

void* shed__runtime__memory_grow(intptr_t increment) {
    return sbrk(increment);
}

#endif