X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=libringbuffer%2Fgetcpu.h;h=fbddb7989336b71235ba238eff9ae860c41a3d6e;hb=03edf5f6766b95cf1cbc0b4712bc7b70c153e16a;hp=3474bfe0c04f9f218eac190b001b08600f9d8272;hpb=c993aa602df5d770ea1da811c4f7f643dde1ed34;p=lttng-ust.git diff --git a/libringbuffer/getcpu.h b/libringbuffer/getcpu.h index 3474bfe0..fbddb798 100644 --- a/libringbuffer/getcpu.h +++ b/libringbuffer/getcpu.h @@ -20,8 +20,14 @@ */ #include +#include +#include -#ifdef UST_VALGRIND +void lttng_ust_getcpu_init(void); + +extern int (*lttng_get_cpu)(void); + +#ifdef LTTNG_UST_DEBUG_VALGRIND /* * Fallback on cpu 0 if liblttng-ust is build with Valgrind support. @@ -29,7 +35,7 @@ * migration, so it is only statistically accurate. */ static inline -int lttng_ust_get_cpu(void) +int lttng_ust_get_cpu_internal(void) { return 0; } @@ -41,14 +47,17 @@ int lttng_ust_get_cpu(void) */ #ifdef __linux__ -#ifdef __UCLIBC__ +/* old uClibc versions didn't have sched_getcpu */ +#if defined(__UCLIBC__) && __UCLIBC_MAJOR__ == 0 && \ + (__UCLIBC_MINOR__ < 9 || \ + (__UCLIBC_MINOR__ == 9 && __UCLIBC_SUBLEVEL__ <= 32)) #include #define __getcpu(cpu, node, cache) syscall(__NR_getcpu, cpu, node, cache) /* * If getcpu is not implemented in the kernel, use cpu 0 as fallback. */ static inline -int lttng_ust_get_cpu(void) +int lttng_ust_get_cpu_internal(void) { int cpu, ret; @@ -64,7 +73,7 @@ int lttng_ust_get_cpu(void) * If getcpu is not implemented in the kernel, use cpu 0 as fallback. */ static inline -int lttng_ust_get_cpu(void) +int lttng_ust_get_cpu_internal(void) { int cpu; @@ -75,14 +84,14 @@ int lttng_ust_get_cpu(void) } #endif /* __UCLIBC__ */ -#elif defined(__FreeBSD__) +#elif (defined(__FreeBSD__) || defined(__CYGWIN__)) /* - * FreeBSD does not allow query of CPU ID. Always use CPU number 0, with - * the assocated performance degradation on SMP. + * FreeBSD and Cygwin do not allow query of CPU ID. Always use CPU + * number 0, with the assocated performance degradation on SMP. */ static inline -int lttng_ust_get_cpu(void) +int lttng_ust_get_cpu_internal(void) { return 0; } @@ -93,4 +102,16 @@ int lttng_ust_get_cpu(void) #endif +static inline +int lttng_ust_get_cpu(void) +{ + int (*getcpu)(void) = CMM_LOAD_SHARED(lttng_get_cpu); + + if (caa_likely(!getcpu)) { + return lttng_ust_get_cpu_internal(); + } else { + return getcpu(); + } +} + #endif /* _LTTNG_GETCPU_H */