/* Copyright (C) 2008 Emmanuel Varoquaux This file is part of XOS. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include "unistd.h" #include "xos.h" static void *curbrk = (void *)-1; static void init_curbrk() { __syscall_sbrk(0, &curbrk); } static int sbrk_internal(int incr) { void *_brk; if (__syscall_sbrk(incr, &_brk) == -1) return -1; curbrk = _brk; return 0; } int __attribute__ ((weak, visibility ("default"))) brk(void *addr) { if (curbrk == (void *)-1) init_curbrk(); return sbrk_internal(addr - curbrk); } typeof (brk) __brk __attribute__ ((alias ("brk"))); void __attribute__ ((weak, visibility ("default"))) *sbrk(intptr_t incr) { void *oldbrk; if (curbrk == (void *)-1) init_curbrk(); if (incr == 0) return curbrk; oldbrk = curbrk; if (sbrk_internal(incr) == -1) return (void *)-1; return oldbrk; } typeof (sbrk) __sbrk __attribute__ ((alias ("sbrk")));