wasi-libc/libc-bottom-half/sources/sbrk.c
Dan Gohman ca9046d872
Use consistent style for wasi-libc C source files. (#131)
For now, this means using `//`-style comments in .c source files (though
not public header files), and spaces rather than tabs. No strong opinion
here; this is just what the majority of the current code is using.

This also synchronizes basics/crt/crt1.c with libc-bottom-half's
version, though this is just a cleanup as the former isn't currently used
by the main wasi-libc build.
2019-11-08 11:59:57 -08:00

33 lines
815 B
C

#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <__macro_PAGESIZE.h>
// Bare-bones implementation of sbrk.
void *sbrk(intptr_t increment) {
// sbrk(0) returns the current memory size.
if (increment == 0) {
// The wasm spec doesn't guarantee that memory.grow of 0 always succeeds.
return (void *)(__builtin_wasm_memory_size(0) * PAGESIZE);
}
// We only support page-size increments.
if (increment % PAGESIZE != 0) {
abort();
}
// WebAssembly doesn't support shrinking linear memory.
if (increment < 0) {
abort();
}
uintptr_t old = __builtin_wasm_memory_grow(0, (uintptr_t)increment / PAGESIZE);
if (old == SIZE_MAX) {
errno = ENOMEM;
return (void *)-1;
}
return (void *)(old * PAGESIZE);
}