X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=libringbuffer%2Fgetcpu.h;h=bb815e66141171aa4af62595dcec4a9d66184d4c;hb=c0c0989ab70574e09b2f7e8b48c2da6af664a849;hp=3474bfe0c04f9f218eac190b001b08600f9d8272;hpb=e3feda7db3de3530e7c9c511536c36cccf317013;p=lttng-ust.git diff --git a/libringbuffer/getcpu.h b/libringbuffer/getcpu.h index 3474bfe0..bb815e66 100644 --- a/libringbuffer/getcpu.h +++ b/libringbuffer/getcpu.h @@ -1,27 +1,21 @@ -#ifndef _LTTNG_GETCPU_H -#define _LTTNG_GETCPU_H - /* - * Copyright (c) 2011 - Mathieu Desnoyers + * SPDX-License-Identifier: LGPL-2.1-only * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; only - * version 2.1 of the License. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * Copyright (C) 2011 Mathieu Desnoyers */ +#ifndef _LTTNG_GETCPU_H +#define _LTTNG_GETCPU_H + #include +#include +#include + +void lttng_ust_getcpu_init(void); -#ifdef UST_VALGRIND +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 +23,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,30 +35,30 @@ int lttng_ust_get_cpu(void) */ #ifdef __linux__ -#ifdef __UCLIBC__ +#if !HAVE_SCHED_GETCPU #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; ret = __getcpu(&cpu, NULL, NULL); if (caa_unlikely(ret < 0)) return 0; - return c; + return cpu; } -#else /* __UCLIBC__ */ +#else /* HAVE_SCHED_GETCPU */ #include /* * 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; @@ -73,16 +67,16 @@ int lttng_ust_get_cpu(void) return 0; return cpu; } -#endif /* __UCLIBC__ */ +#endif /* HAVE_SCHED_GETCPU */ -#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 +87,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 */