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)\" diff --git a/src/utils.h b/src/utils.h index 27541e8..765eb64 100644 --- a/src/utils.h +++ b/src/utils.h @@ -64,10 +64,23 @@ 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 */ +/* 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 +/* 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); int getproctitle(char **procbuffer);