diff --git a/libc/Android.mk b/libc/Android.mk index ee7fece67..301be371f 100644 --- a/libc/Android.mk +++ b/libc/Android.mk @@ -151,7 +151,6 @@ libc_common_src_files := \ bionic/atoll.c \ bionic/bindresvport.c \ bionic/bionic_clone.c \ - bionic/brk.c \ bionic/clearenv.c \ bionic/cpuacct.c \ bionic/daemon.c \ @@ -201,7 +200,6 @@ libc_common_src_files := \ bionic/realpath.c \ bionic/reboot.c \ bionic/recv.c \ - bionic/sbrk.c \ bionic/sched_cpualloc.c \ bionic/sched_cpucount.c \ bionic/sched_getaffinity.c \ @@ -270,6 +268,7 @@ libc_common_src_files := \ libc_bionic_src_files := \ bionic/assert.cpp \ + bionic/brk.cpp \ bionic/debug_format.cpp \ bionic/dirent.cpp \ bionic/eventfd.cpp \ @@ -282,6 +281,7 @@ libc_bionic_src_files := \ bionic/__memset_chk.cpp \ bionic/pthread_sigmask.cpp \ bionic/raise.cpp \ + bionic/sbrk.cpp \ bionic/__set_errno.cpp \ bionic/setlocale.cpp \ bionic/signalfd.cpp \ diff --git a/libc/bionic/brk.c b/libc/bionic/brk.cpp similarity index 84% rename from libc/bionic/brk.c rename to libc/bionic/brk.cpp index bf2f10855..633b914c4 100644 --- a/libc/bionic/brk.c +++ b/libc/bionic/brk.cpp @@ -25,21 +25,17 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ -#include + #include -#include -/* shared with sbrk.c */ -char *__bionic_brk; +/* Shared with sbrk.c. */ +extern "C" void* __bionic_brk; // TODO: should be __LIBC_HIDDEN__ but accidentally exported by NDK :-( -int brk(void* end_data) -{ - char* new_brk = __brk( end_data ); - - if (new_brk != end_data) - return -1; - - __bionic_brk = new_brk; - +int brk(void* end_data) { + void* new_brk = __brk(end_data); + if (new_brk != end_data) { + return -1; + } + __bionic_brk = new_brk; return 0; } diff --git a/libc/bionic/sbrk.c b/libc/bionic/sbrk.cpp similarity index 73% rename from libc/bionic/sbrk.c rename to libc/bionic/sbrk.cpp index a112b6c2b..6c9b534c3 100644 --- a/libc/bionic/sbrk.c +++ b/libc/bionic/sbrk.cpp @@ -25,36 +25,31 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ + #include #include +/* Shared with brk.c. */ +extern "C" { + void* __bionic_brk; // TODO: should be __LIBC_HIDDEN__ but accidentally exported by NDK :-( +} -#define SBRK_ALIGN 32 - -/* shared with brk() implementation */ -char* __bionic_brk; - -void *sbrk(ptrdiff_t increment) -{ - char* start; - char* end; - char* new_brk; - - if ( !__bionic_brk) - __bionic_brk = __brk((void*)0); - - start = (char*)(((long)__bionic_brk + SBRK_ALIGN-1) & ~(SBRK_ALIGN-1)); - end = start + increment; - - new_brk = __brk(end); - if (new_brk == (void*)-1) - return new_brk; - else if (new_brk < end) - { - errno = ENOMEM; - return (void*)-1; +void* sbrk(ptrdiff_t increment) { + if (__bionic_brk == NULL) { + __bionic_brk = __brk(NULL); } - __bionic_brk = new_brk; - return start; + void* original_brk = __bionic_brk; + void* desired_brk = (void*) ((uintptr_t) original_brk + increment); + + void* new_brk = __brk(desired_brk); + if (new_brk == (void*) -1) { + return new_brk; + } else if (new_brk < desired_brk) { + errno = ENOMEM; + return (void*) -1; + } + + __bionic_brk = new_brk; + return original_brk; } diff --git a/tests/unistd_test.cpp b/tests/unistd_test.cpp index a9dd5d2d1..3ccaf3bed 100644 --- a/tests/unistd_test.cpp +++ b/tests/unistd_test.cpp @@ -16,8 +16,19 @@ #include +#include #include TEST(unistd, sysconf_SC_MONOTONIC_CLOCK) { ASSERT_GT(sysconf(_SC_MONOTONIC_CLOCK), 0); } + +TEST(unistd, sbrk) { + void* initial_break = sbrk(0); + + void* new_break = reinterpret_cast(reinterpret_cast(initial_break) + 2000); + ASSERT_EQ(0, brk(new_break)); + + void* final_break = sbrk(0); + ASSERT_EQ(final_break, new_break); +}