From b166c1d1b9972b3b12bc1084b1d95ccec4d1813b Mon Sep 17 00:00:00 2001 From: Haneef Mubarak Date: Wed, 17 Jun 2015 09:05:24 -0700 Subject: [PATCH 1/4] apply changes from #4 to utils.h --- src/utils.h | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/utils.h b/src/utils.h index 27541e8..2476472 100644 --- a/src/utils.h +++ b/src/utils.h @@ -64,11 +64,25 @@ static inline void *xrealloc(void *ptr, size_t size) #define brubeck_atomic_fetch(P) __sync_add_and_fetch((P), 0) /* Compile read-write barrier */ -#define brubeck_barrier() __asm__ volatile("": : :"memory") +#define brubeck_barrier() __sync_synchronize() /* Pause instruction to prevent excess processor bus usage */ #define brubeck_cpu_relax() __asm__ volatile("pause\n": : :"memory") +/* Pause instruction to prevent excess processor bus usage (when possible) */ +#if defined(__i386) || defined(__x86_64__) +#define brubeck_cpu_relax() __asm__ volatile("pause\n": : :"memory") +#elif defined(__powerpc__) || defined(__ppc__) || defined(__PPC__) \ + || defined(__powerpc64__) || defined(__ppc64__) || defined(__PPC64__) +#define brubeck_cpu_relax() __asm__ volatile("or 27,27,27\n": : :"memory") +#elif defined(__ARM_ARCH_6T2__) || defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) \ + || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) \ + || defined(__ARM_ARCH_7S__) || defined(__aarch64__) +#define brubeck_cpu_relax() __asm__ volatile("yield\n": : :"memory") +#else +#define brubeck_cpu_relax() break +#endif + void initproctitle (int argc, char **argv); int getproctitle(char **procbuffer); void setproctitle (const char *prog, const char *txt); From 8240effdf57dbb6aebe333199839c180bf83347e Mon Sep 17 00:00:00 2001 From: Haneef Mubarak Date: Wed, 17 Jun 2015 09:06:49 -0700 Subject: [PATCH 2/4] forgot to remove nonportable cpu relaxer --- src/utils.h | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/utils.h b/src/utils.h index 2476472..0bd8df1 100644 --- a/src/utils.h +++ b/src/utils.h @@ -66,9 +66,6 @@ static inline void *xrealloc(void *ptr, size_t size) /* Compile read-write barrier */ #define brubeck_barrier() __sync_synchronize() -/* Pause instruction to prevent excess processor bus usage */ -#define brubeck_cpu_relax() __asm__ volatile("pause\n": : :"memory") - /* Pause instruction to prevent excess processor bus usage (when possible) */ #if defined(__i386) || defined(__x86_64__) #define brubeck_cpu_relax() __asm__ volatile("pause\n": : :"memory") From e8da26037e0657f7b2f15b1479faa8e9c5b813b3 Mon Sep 17 00:00:00 2001 From: Haneef Mubarak Date: Wed, 17 Jun 2015 10:06:27 -0700 Subject: [PATCH 3/4] use pthread_yield if bus yielding is unavailable If a platform does not support bus yielding, yield the threads' cpu timeslice early. --- src/utils.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/utils.h b/src/utils.h index 0bd8df1..765eb64 100644 --- a/src/utils.h +++ b/src/utils.h @@ -77,7 +77,9 @@ static inline void *xrealloc(void *ptr, size_t size) || defined(__ARM_ARCH_7S__) || defined(__aarch64__) #define brubeck_cpu_relax() __asm__ volatile("yield\n": : :"memory") #else -#define brubeck_cpu_relax() break +/* Many OSes support it, but some require odd macros to get the declaration */ +int pthread_yield(void); +#define brubeck_cpu_relax() pthread_yield () #endif void initproctitle (int argc, char **argv); From 67aebbd0ec2074581c9f18ac5f69b01d47312d41 Mon Sep 17 00:00:00 2001 From: Haneef Mubarak Date: Wed, 17 Jun 2015 10:07:44 -0700 Subject: [PATCH 4/4] use -pthread instead of -lpthread when compiling And here is why: http://stackoverflow.com/a/23251828/2334407 --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 74b9c6d..84c4473 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ GIT_SHA = $(shell git rev-parse --short HEAD) TARGET = brubeck -LIBS = -lm -lpthread -lrt -lcrypto -ljansson +LIBS = -lm -pthread -lrt -lcrypto -ljansson CC = gcc CXX = g++ CFLAGS = -g -Wall -O3 -Wno-strict-aliasing -Isrc -Ivendor/ck/include -DNDEBUG=1 -DGIT_SHA=\"$(GIT_SHA)\"