X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fcommon%2Fcompat%2Fpthread.h;h=511ab089b3ed975c00cbb84e229b9c17c2bb2e22;hp=87aa746ba13e68e624b57d1c433d0da0c44d2c61;hb=014d7d3b5e9d69989bf776cffb6c21ff7e1d36ff;hpb=5dee2ed25e797cc4a70a6180b7d5fc2bf0696c21 diff --git a/src/common/compat/pthread.h b/src/common/compat/pthread.h index 87aa746ba..511ab089b 100644 --- a/src/common/compat/pthread.h +++ b/src/common/compat/pthread.h @@ -10,19 +10,83 @@ #include #include +#include + +#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); } + +static inline +int lttng_pthread_getname_np(char *name, size_t len) +{ + return pthread_getname_np(pthread_self(), name, len); +} #elif defined(HAVE_PTHREAD_SETNAME_NP_WITHOUT_TID) static inline int lttng_pthread_setname_np(const char *name) { return pthread_setname_np(name); } + +static inline +int lttng_pthread_getname_np(char *name, size_t len) +{ + return pthread_getname_np(name, len); +} +#elif defined(HAVE_PTHREAD_SET_NAME_NP_WITH_TID) + +#include +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; +} + +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_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); +} + +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. @@ -32,6 +96,12 @@ int lttng_pthread_setname_np(const char *name) { return -ENOSYS; } + +static inline +int lttng_pthread_getname_np(char *name, size_t len) +{ + return -ENOSYS; +} #endif #endif /* _COMPAT_PTHREAD_H */