2 * Copyright (C) 2020 Michael Jeanson <mjeanson@efficios.com>
4 * SPDX-License-Identifier: LGPL-2.1-only
8 #ifndef _COMPAT_PTHREAD_H
9 #define _COMPAT_PTHREAD_H
11 #include <common/compat/errno.hpp>
17 #include <pthread_np.h>
20 #define LTTNG_PTHREAD_NAMELEN 16
22 #if defined(HAVE_PTHREAD_SETNAME_NP_WITH_TID)
23 static inline int lttng_pthread_setname_np(const char *name)
26 * Some implementations don't error out, replicate this behavior for
29 if (strnlen(name, LTTNG_PTHREAD_NAMELEN) >= LTTNG_PTHREAD_NAMELEN) {
33 return pthread_setname_np(pthread_self(), name);
35 #elif defined(HAVE_PTHREAD_SETNAME_NP_WITHOUT_TID)
36 static inline int lttng_pthread_setname_np(const char *name)
38 return pthread_setname_np(name);
40 #elif defined(HAVE_PTHREAD_SET_NAME_NP_WITH_TID)
42 static inline int lttng_pthread_setname_np(const char *name)
44 /* Replicate pthread_setname_np's behavior. */
45 if (strnlen(name, LTTNG_PTHREAD_NAMELEN) >= LTTNG_PTHREAD_NAMELEN) {
49 pthread_set_name_np(pthread_self(), name);
52 #elif defined(__linux__)
54 /* Fallback on prtctl on Linux */
55 #include <sys/prctl.h>
57 static inline int lttng_pthread_setname_np(const char *name)
59 /* Replicate pthread_setname_np's behavior. */
60 if (strnlen(name, LTTNG_PTHREAD_NAMELEN) >= LTTNG_PTHREAD_NAMELEN) {
63 return prctl(PR_SET_NAME, name, 0, 0, 0);
67 * For platforms without thread name support, do nothing.
69 static inline int lttng_pthread_setname_np(const char *name)
75 #if defined(HAVE_PTHREAD_GETNAME_NP_WITH_TID)
76 static inline int lttng_pthread_getname_np(char *name, size_t len)
78 return pthread_getname_np(pthread_self(), name, len);
80 #elif defined(HAVE_PTHREAD_GETNAME_NP_WITHOUT_TID)
81 static inline int lttng_pthread_getname_np(char *name, size_t len)
83 return pthread_getname_np(name, len);
85 #elif defined(HAVE_PTHREAD_GET_NAME_NP_WITH_TID)
86 static inline int lttng_pthread_getname_np(char *name, size_t len)
88 pthread_get_name_np(pthread_self(), name, len);
91 #elif defined(__linux__)
93 /* Fallback on prtctl on Linux */
94 #include <sys/prctl.h>
96 static inline int lttng_pthread_getname_np(char *name, size_t len)
98 return prctl(PR_GET_NAME, name, 0, 0, 0);
102 * For platforms without thread name support, do nothing.
104 static inline int lttng_pthread_getname_np(char *name, size_t len)
110 #endif /* _COMPAT_PTHREAD_H */