OSDN Git Service

Remove bogus extra alignment from sbrk.
authorElliott Hughes <enh@google.com>
Wed, 6 Feb 2013 00:10:59 +0000 (16:10 -0800)
committerElliott Hughes <enh@google.com>
Wed, 6 Feb 2013 00:10:59 +0000 (16:10 -0800)
Bug: https://code.google.com/p/android/issues/detail?id=37349
Change-Id: I970c7b6be7bb7fbe6bbbe2c332f05816aeb0e09f

libc/Android.mk
libc/bionic/brk.cpp [moved from libc/bionic/brk.c with 84% similarity]
libc/bionic/sbrk.cpp [moved from libc/bionic/sbrk.c with 73% similarity]
tests/unistd_test.cpp

index ee7fece..301be37 100644 (file)
@@ -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 \
similarity index 84%
rename from libc/bionic/brk.c
rename to libc/bionic/brk.cpp
index bf2f108..633b914 100644 (file)
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  */
-#include <stddef.h>
-#include <unistd.h>
-#include <sys/types.h>
-
-/* shared with sbrk.c */
-char *__bionic_brk;
 
-int brk(void*  end_data)
-{
-    char*  new_brk = __brk( end_data );
+#include <unistd.h>
 
-    if (new_brk != end_data)
-        return -1;
+/* Shared with sbrk.c. */
+extern "C" void* __bionic_brk; // TODO: should be __LIBC_HIDDEN__ but accidentally exported by NDK :-(
 
-    __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;
 }
similarity index 73%
rename from libc/bionic/sbrk.c
rename to libc/bionic/sbrk.cpp
index a112b6c..6c9b534 100644 (file)
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  */
+
 #include <unistd.h>
 #include <errno.h>
 
+/* 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);
+void* sbrk(ptrdiff_t increment) {
+  if (__bionic_brk == NULL) {
+    __bionic_brk = __brk(NULL);
+  }
 
-    start = (char*)(((long)__bionic_brk + SBRK_ALIGN-1) & ~(SBRK_ALIGN-1));
-  end   = start + increment;
+  void* original_brk = __bionic_brk;
+  void* desired_brk = (void*) ((uintptr_t) original_brk + increment);
 
-  new_brk = __brk(end);
-    if (new_brk == (void*)-1)
-        return new_brk;
-    else if (new_brk < end)
-    {
+  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;
+    return (void*) -1;
   }
 
-    __bionic_brk = new_brk;
-  return start;
+  __bionic_brk = new_brk;
+  return original_brk;
 }
index a9dd5d2..3ccaf3b 100644 (file)
 
 #include <gtest/gtest.h>
 
+#include <stdint.h>
 #include <unistd.h>
 
 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<void*>(reinterpret_cast<uintptr_t>(initial_break) + 2000);
+  ASSERT_EQ(0, brk(new_break));
+
+  void* final_break = sbrk(0);
+  ASSERT_EQ(final_break, new_break);
+}