From 212e0e38248860b151b28877225629a988d95b58 Mon Sep 17 00:00:00 2001 From: Elliott Hughes Date: Mon, 1 Dec 2014 16:43:51 -0800 Subject: [PATCH] Build our benchmarks against glibc too. Bug: 18556607 Change-Id: I455ac8b93c0835836180e549486bc52d393ee6a6 --- benchmarks/Android.mk | 25 ++++++++++++++++++++++--- benchmarks/benchmark_main.cpp | 1 + benchmarks/pthread_benchmark.cpp | 4 ++-- benchmarks/time_benchmark.cpp | 2 ++ benchmarks/unistd_benchmark.cpp | 4 ++++ libc/bionic/pthread_atfork.cpp | 4 ++-- libc/include/pthread.h | 10 +++++++--- linker/dlfcn.cpp | 2 +- 8 files changed, 41 insertions(+), 11 deletions(-) diff --git a/benchmarks/Android.mk b/benchmarks/Android.mk index eb39a8590..f16346339 100644 --- a/benchmarks/Android.mk +++ b/benchmarks/Android.mk @@ -32,7 +32,6 @@ benchmark_c_flags = \ benchmark_src_files = \ benchmark_main.cpp \ math_benchmark.cpp \ - property_benchmark.cpp \ pthread_benchmark.cpp \ semaphore_benchmark.cpp \ stdio_benchmark.cpp \ @@ -41,7 +40,8 @@ benchmark_src_files = \ unistd_benchmark.cpp \ # Build benchmarks for the device (with bionic's .so). Run with: -# adb shell bionic-benchmarks +# adb shell bionic-benchmarks32 +# adb shell bionic-benchmarks64 include $(CLEAR_VARS) LOCAL_MODULE := bionic-benchmarks LOCAL_MODULE_STEM_32 := bionic-benchmarks32 @@ -49,10 +49,29 @@ LOCAL_MODULE_STEM_64 := bionic-benchmarks64 LOCAL_MULTILIB := both LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk LOCAL_CFLAGS += $(benchmark_c_flags) -LOCAL_SRC_FILES := $(benchmark_src_files) +LOCAL_SRC_FILES := $(benchmark_src_files) property_benchmark.cpp LOCAL_CXX_STL := libc++ include $(BUILD_EXECUTABLE) +# We don't build a static benchmark executable because it's not usually +# useful. If you're trying to run the current benchmarks on an older +# release, it's (so far at least) always because you want to measure the +# performance of the old release's libc, and a static benchmark isn't +# going to let you do that. + +# Build benchmarks for the host (against glibc!). Run with: +include $(CLEAR_VARS) +LOCAL_MODULE := bionic-benchmarks-glibc +LOCAL_MODULE_STEM_32 := bionic-benchmarks-glibc32 +LOCAL_MODULE_STEM_64 := bionic-benchmarks-glibc64 +LOCAL_MULTILIB := both +LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk +LOCAL_CFLAGS += $(benchmark_c_flags) +LOCAL_LDFLAGS += -lrt +LOCAL_SRC_FILES := $(benchmark_src_files) +LOCAL_CXX_STL := libc++ +include $(BUILD_HOST_EXECUTABLE) + ifeq ($(HOST_OS)-$(HOST_ARCH),$(filter $(HOST_OS)-$(HOST_ARCH),linux-x86 linux-x86_64)) ifeq ($(TARGET_ARCH),x86) LINKER = linker diff --git a/benchmarks/benchmark_main.cpp b/benchmarks/benchmark_main.cpp index d60670b9b..815d56b68 100644 --- a/benchmarks/benchmark_main.cpp +++ b/benchmarks/benchmark_main.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include #include diff --git a/benchmarks/pthread_benchmark.cpp b/benchmarks/pthread_benchmark.cpp index 11db56d1c..92e59982f 100644 --- a/benchmarks/pthread_benchmark.cpp +++ b/benchmarks/pthread_benchmark.cpp @@ -80,7 +80,7 @@ BENCHMARK(BM_pthread_mutex_lock); static void BM_pthread_mutex_lock_ERRORCHECK(int iters) { StopBenchmarkTiming(); - pthread_mutex_t mutex = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER; + pthread_mutex_t mutex = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP; StartBenchmarkTiming(); for (int i = 0; i < iters; ++i) { @@ -94,7 +94,7 @@ BENCHMARK(BM_pthread_mutex_lock_ERRORCHECK); static void BM_pthread_mutex_lock_RECURSIVE(int iters) { StopBenchmarkTiming(); - pthread_mutex_t mutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER; + pthread_mutex_t mutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP; StartBenchmarkTiming(); for (int i = 0; i < iters; ++i) { diff --git a/benchmarks/time_benchmark.cpp b/benchmarks/time_benchmark.cpp index 22f6e8ea0..f093ec19f 100644 --- a/benchmarks/time_benchmark.cpp +++ b/benchmarks/time_benchmark.cpp @@ -16,7 +16,9 @@ #include "benchmark.h" +#include #include +#include #include static void BM_time_clock_gettime(int iters) { diff --git a/benchmarks/unistd_benchmark.cpp b/benchmarks/unistd_benchmark.cpp index 7e2ac30c9..94be1dd5e 100644 --- a/benchmarks/unistd_benchmark.cpp +++ b/benchmarks/unistd_benchmark.cpp @@ -41,6 +41,8 @@ static void BM_unistd_getpid_syscall(int iters) { } BENCHMARK(BM_unistd_getpid_syscall); +#if defined(__BIONIC__) + // Stop GCC optimizing out our pure function. /* Must not be static! */ pid_t (*gettid_fp)() = gettid; @@ -55,6 +57,8 @@ static void BM_unistd_gettid(int iters) { } BENCHMARK(BM_unistd_gettid); +#endif + static void BM_unistd_gettid_syscall(int iters) { StartBenchmarkTiming(); diff --git a/libc/bionic/pthread_atfork.cpp b/libc/bionic/pthread_atfork.cpp index 82e2b595d..d1c4ad0c4 100644 --- a/libc/bionic/pthread_atfork.cpp +++ b/libc/bionic/pthread_atfork.cpp @@ -44,7 +44,7 @@ struct atfork_list_t { atfork_t* last; }; -static pthread_mutex_t g_atfork_list_mutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER; +static pthread_mutex_t g_atfork_list_mutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP; static atfork_list_t g_atfork_list = { NULL, NULL }; void __bionic_atfork_run_prepare() { @@ -73,7 +73,7 @@ void __bionic_atfork_run_child() { } } - g_atfork_list_mutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER; + g_atfork_list_mutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP; } void __bionic_atfork_run_parent() { diff --git a/libc/include/pthread.h b/libc/include/pthread.h index 24dba1bcf..21787894d 100644 --- a/libc/include/pthread.h +++ b/libc/include/pthread.h @@ -53,9 +53,13 @@ typedef struct { #define __PTHREAD_RECURSIVE_MUTEX_INIT_VALUE 0x4000 #define __PTHREAD_ERRORCHECK_MUTEX_INIT_VALUE 0x8000 -#define PTHREAD_MUTEX_INITIALIZER {__PTHREAD_MUTEX_INIT_VALUE __RESERVED_INITIALIZER} -#define PTHREAD_RECURSIVE_MUTEX_INITIALIZER {__PTHREAD_RECURSIVE_MUTEX_INIT_VALUE __RESERVED_INITIALIZER} -#define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER {__PTHREAD_ERRORCHECK_MUTEX_INIT_VALUE __RESERVED_INITIALIZER} +#define PTHREAD_MUTEX_INITIALIZER {__PTHREAD_MUTEX_INIT_VALUE __RESERVED_INITIALIZER} +#define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP {__PTHREAD_ERRORCHECK_MUTEX_INIT_VALUE __RESERVED_INITIALIZER} +#define PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP {__PTHREAD_RECURSIVE_MUTEX_INIT_VALUE __RESERVED_INITIALIZER} + +/* TODO: remove this namespace pollution. */ +#define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP +#define PTHREAD_RECURSIVE_MUTEX_INITIALIZER PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP enum { PTHREAD_MUTEX_NORMAL = 0, diff --git a/linker/dlfcn.cpp b/linker/dlfcn.cpp index 2486e021f..57b2c23b2 100644 --- a/linker/dlfcn.cpp +++ b/linker/dlfcn.cpp @@ -29,7 +29,7 @@ /* This file hijacks the symbols stubbed out in libdl.so. */ -static pthread_mutex_t g_dl_mutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER; +static pthread_mutex_t g_dl_mutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP; static const char* __bionic_set_dlerror(char* new_value) { char** dlerror_slot = &reinterpret_cast(__get_tls())[TLS_SLOT_DLERROR]; -- 2.11.0