X-Git-Url: https://git.liburcu.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fcommon%2Fcompat%2Fpthread.h;h=bedfd91ff5387e26ef5f71da6afc19ba8614be02;hp=4d3f9c7720cd7623218c966c7ce4eec723b42193;hb=3f3e7eb74963e75f9b0bb76b854d8be2dcbb0443;hpb=8bd71deafbf1d15f47f4935280a6290368ec6224 diff --git a/src/common/compat/pthread.h b/src/common/compat/pthread.h index 4d3f9c772..bedfd91ff 100644 --- a/src/common/compat/pthread.h +++ b/src/common/compat/pthread.h @@ -9,12 +9,27 @@ #define _COMPAT_PTHREAD_H #include -#include +#include +#include + +#ifdef __FreeBSD__ +#include +#endif + +#define LTTNG_PTHREAD_NAMELEN 16 #if defined(HAVE_PTHREAD_SETNAME_NP_WITH_TID) static inline int lttng_pthread_setname_np(const char *name) { + /* + * Some implementations don't error out, replicate this behavior for + * consistency. + */ + if (strnlen(name, LTTNG_PTHREAD_NAMELEN) >= LTTNG_PTHREAD_NAMELEN) { + return ERANGE; + } + return pthread_setname_np(pthread_self(), name); } #elif defined(HAVE_PTHREAD_SETNAME_NP_WITHOUT_TID) @@ -23,6 +38,33 @@ int lttng_pthread_setname_np(const char *name) { return pthread_setname_np(name); } +#elif defined(HAVE_PTHREAD_SET_NAME_NP_WITH_TID) + +static inline +int lttng_pthread_setname_np(const char *name) +{ + /* Replicate pthread_setname_np's behavior. */ + if (strnlen(name, LTTNG_PTHREAD_NAMELEN) >= LTTNG_PTHREAD_NAMELEN) { + return ERANGE; + } + + pthread_set_name_np(pthread_self(), name); + return 0; +} +#elif defined(__linux__) + +/* Fallback on prtctl on Linux */ +#include + +static inline +int lttng_pthread_setname_np(const char *name) +{ + /* Replicate pthread_setname_np's behavior. */ + if (strnlen(name, LTTNG_UST_ABI_PROCNAME_LEN) >= LTTNG_UST_ABI_PROCNAME_LEN) { + return ERANGE; + } + return prctl(PR_SET_NAME, name, 0, 0, 0); +} #else /* * For platforms without thread name support, do nothing. @@ -34,4 +76,45 @@ int lttng_pthread_setname_np(const char *name) } #endif + +#if defined(HAVE_PTHREAD_GETNAME_NP_WITH_TID) +static inline +int lttng_pthread_getname_np(char *name, size_t len) +{ + return pthread_getname_np(pthread_self(), name, len); +} +#elif defined(HAVE_PTHREAD_GETNAME_NP_WITHOUT_TID) +static inline +int lttng_pthread_getname_np(char *name, size_t len) +{ + return pthread_getname_np(name, len); +} +#elif defined(HAVE_PTHREAD_GET_NAME_NP_WITH_TID) +static inline +int lttng_pthread_getname_np(char *name, size_t len) +{ + pthread_get_name_np(pthread_self(), name, len); + return 0; +} +#elif defined(__linux__) + +/* Fallback on prtctl on Linux */ +#include + +static inline +int lttng_pthread_getname_np(char *name, size_t len) +{ + return prctl(PR_GET_NAME, name, 0, 0, 0); +} +#else +/* + * For platforms without thread name support, do nothing. + */ +static inline +int lttng_pthread_getname_np(char *name, size_t len) +{ + return -ENOSYS; +} +#endif + #endif /* _COMPAT_PTHREAD_H */