diff --git a/tests/bionic/libc/Android.mk b/tests/bionic/libc/Android.mk index d08d30a6..4056d55b 100644 --- a/tests/bionic/libc/Android.mk +++ b/tests/bionic/libc/Android.mk @@ -31,7 +31,6 @@ define device-test $(eval LOCAL_SRC_FILES := $(file)) \ $(eval LOCAL_MODULE := $(notdir $(file:%.c=%))) \ $(eval LOCAL_MODULE := $(LOCAL_MODULE:%.cpp=%)) \ - $(eval $(info LOCAL_MODULE=$(LOCAL_MODULE))) \ $(eval LOCAL_CFLAGS += $(EXTRA_CFLAGS)) \ $(eval LOCAL_MODULE_TAGS := tests) \ $(eval include $(BUILD_EXECUTABLE)) \ @@ -48,7 +47,6 @@ define host-test $(eval LOCAL_SRC_FILES := $(file)) \ $(eval LOCAL_MODULE := $(notdir $(file:%.c=%))) \ $(eval LOCAL_MODULE := $(LOCAL_MODULE:%.cpp=%)) \ - $(eval $(info LOCAL_MODULE=$(LOCAL_MODULE) file=$(file))) \ $(eval LOCAL_CFLAGS += $(EXTRA_CFLAGS)) \ $(eval LOCAL_LDLIBS += $(EXTRA_LDLIBS)) \ $(eval LOCAL_MODULE_TAGS := tests) \ @@ -148,6 +146,19 @@ LOCAL_MODULE := test_static_init LOCAL_SHARED_LIBRARIES := libtest_static_init include $(BUILD_EXECUTABLE) +# Testing 'clone' is only possible on Linux systems +include $(CLEAR_VARS) +LOCAL_SRC_FILES := common/test_clone.c +LOCAL_MODULE := test_clone +include $(BUILD_EXECUTABLE) + +ifeq ($(HOST_OS),linux) +include $(CLEAR_VARS) +LOCAL_SRC_FILES := common/test_clone.c +LOCAL_MODULE := test_clone +include $(BUILD_HOST_EXECUTABLE) +endif + # TODO: Add a variety of GLibc test programs too... # Hello World to test libstdc++ support diff --git a/tests/bionic/libc/bionic/lib_static_init.h b/tests/bionic/libc/bionic/lib_static_init.h index f455de8e..934eb8f4 100644 --- a/tests/bionic/libc/bionic/lib_static_init.h +++ b/tests/bionic/libc/bionic/lib_static_init.h @@ -8,8 +8,13 @@ class Foo { public: virtual int getValue(); Foo(); + virtual ~Foo(); }; +Foo::~Foo() +{ +} + extern Foo theFoo; #endif /* _lib_static_init_h */ diff --git a/tests/bionic/libc/common/test_clone.c b/tests/bionic/libc/common/test_clone.c new file mode 100644 index 00000000..afbb9c17 --- /dev/null +++ b/tests/bionic/libc/common/test_clone.c @@ -0,0 +1,56 @@ +/* Check that clone() is implemented and properly works + */ +#define __GNU_SOURCE 1 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static int +clone_child (void *arg) +{ + errno = 0; + ptrace (PTRACE_TRACEME, 0, 0, 0); + if (errno != 0) + perror ("ptrace"); + if (kill (getpid (), SIGSTOP) < 0) + perror ("kill"); + return 0; +} + +#define PAGE_SIZE 4096 +#define STACK_SIZE (4 * PAGE_SIZE) + +char clone_stack[STACK_SIZE] __attribute__ ((aligned (PAGE_SIZE))); + +int +main () +{ + int pid,child; + int status; + + pid = clone (clone_child, clone_stack + 3 * PAGE_SIZE, + CLONE_VM | SIGCHLD, NULL); + if (pid < 0) + { + perror ("clone"); + exit (1); + } + printf ("child pid %d\n", pid); + + //sleep(20); + child = waitpid (pid, &status, 0); + printf("waitpid returned %d\n", child); + if (child < 0) { + perror ("waitpid"); + return 1; + } + printf ("child %d, status 0x%x\n", child, status); + return 0; +} diff --git a/tests/bionic/libc/common/test_static_cpp_mutex.cpp b/tests/bionic/libc/common/test_static_cpp_mutex.cpp index 33a56ef4..ea5d4793 100644 --- a/tests/bionic/libc/common/test_static_cpp_mutex.cpp +++ b/tests/bionic/libc/common/test_static_cpp_mutex.cpp @@ -37,6 +37,7 @@ class Foo { public: virtual int getValue(); Foo(); + virtual ~Foo(); }; Foo::Foo() @@ -50,6 +51,11 @@ Foo::Foo() fprintf(stderr, "recursive lock initialized and locked\n" ); } +Foo::~Foo() +{ + pthread_mutex_unlock(&mMutex); +} + int Foo::getValue() { return 0;