blob: cc01c8ffb6dffe6ef1874c3528a8b1e4c13029ae [file] [log] [blame]
#include <sys/types.h>
/* brk is handled entirely within the C library. This limits METAL programs that
* use the C library to be disallowed from dynamically allocating memory
* without talking to the C library, but that sounds like a sane way to go
* about it. Note that there is no error checking anywhere in this file, users
* will simply get the relevant error when actually trying to use the memory
* that's been allocated. */
extern char metal_segment_heap_target_start;
extern char metal_segment_heap_target_end;
static char *brk = &metal_segment_heap_target_start;
int
_brk(void *addr)
{
brk = addr;
return 0;
}
char *
_sbrk(ptrdiff_t incr)
{
char *old = brk;
/* If __heap_size == 0, we can't allocate memory on the heap */
if(&metal_segment_heap_target_start == &metal_segment_heap_target_end) {
return (void *)-1;
}
/* Don't move the break past the end of the heap */
if ((brk + incr) < &metal_segment_heap_target_end) {
brk += incr;
} else {
brk = &metal_segment_heap_target_end;
return (void *)-1;
}
return old;
}