Clean-up: consumer.hpp: coding style indentation fix
[lttng-tools.git] / src / common / compat / pthread.hpp
1 /*
2 * Copyright (C) 2020 Michael Jeanson <mjeanson@efficios.com>
3 *
4 * SPDX-License-Identifier: LGPL-2.1-only
5 *
6 */
7
8 #ifndef _COMPAT_PTHREAD_H
9 #define _COMPAT_PTHREAD_H
10
11 #include <common/compat/errno.hpp>
12
13 #include <pthread.h>
14 #include <string.h>
15
16 #ifdef __FreeBSD__
17 #include <pthread_np.h>
18 #endif
19
20 #define LTTNG_PTHREAD_NAMELEN 16
21
22 #if defined(HAVE_PTHREAD_SETNAME_NP_WITH_TID)
23 static inline int lttng_pthread_setname_np(const char *name)
24 {
25 /*
26 * Some implementations don't error out, replicate this behavior for
27 * consistency.
28 */
29 if (strnlen(name, LTTNG_PTHREAD_NAMELEN) >= LTTNG_PTHREAD_NAMELEN) {
30 return ERANGE;
31 }
32
33 return pthread_setname_np(pthread_self(), name);
34 }
35 #elif defined(HAVE_PTHREAD_SETNAME_NP_WITHOUT_TID)
36 static inline int lttng_pthread_setname_np(const char *name)
37 {
38 return pthread_setname_np(name);
39 }
40 #elif defined(HAVE_PTHREAD_SET_NAME_NP_WITH_TID)
41
42 static inline int lttng_pthread_setname_np(const char *name)
43 {
44 /* Replicate pthread_setname_np's behavior. */
45 if (strnlen(name, LTTNG_PTHREAD_NAMELEN) >= LTTNG_PTHREAD_NAMELEN) {
46 return ERANGE;
47 }
48
49 pthread_set_name_np(pthread_self(), name);
50 return 0;
51 }
52 #elif defined(__linux__)
53
54 /* Fallback on prtctl on Linux */
55 #include <sys/prctl.h>
56
57 static inline int lttng_pthread_setname_np(const char *name)
58 {
59 /* Replicate pthread_setname_np's behavior. */
60 if (strnlen(name, LTTNG_PTHREAD_NAMELEN) >= LTTNG_PTHREAD_NAMELEN) {
61 return ERANGE;
62 }
63 return prctl(PR_SET_NAME, name, 0, 0, 0);
64 }
65 #else
66 /*
67 * For platforms without thread name support, do nothing.
68 */
69 static inline int lttng_pthread_setname_np(const char *name)
70 {
71 return -ENOSYS;
72 }
73 #endif
74
75 #if defined(HAVE_PTHREAD_GETNAME_NP_WITH_TID)
76 static inline int lttng_pthread_getname_np(char *name, size_t len)
77 {
78 return pthread_getname_np(pthread_self(), name, len);
79 }
80 #elif defined(HAVE_PTHREAD_GETNAME_NP_WITHOUT_TID)
81 static inline int lttng_pthread_getname_np(char *name, size_t len)
82 {
83 return pthread_getname_np(name, len);
84 }
85 #elif defined(HAVE_PTHREAD_GET_NAME_NP_WITH_TID)
86 static inline int lttng_pthread_getname_np(char *name, size_t len)
87 {
88 pthread_get_name_np(pthread_self(), name, len);
89 return 0;
90 }
91 #elif defined(__linux__)
92
93 /* Fallback on prtctl on Linux */
94 #include <sys/prctl.h>
95
96 static inline int lttng_pthread_getname_np(char *name, size_t len)
97 {
98 return prctl(PR_GET_NAME, name, 0, 0, 0);
99 }
100 #else
101 /*
102 * For platforms without thread name support, do nothing.
103 */
104 static inline int lttng_pthread_getname_np(char *name, size_t len)
105 {
106 return -ENOSYS;
107 }
108 #endif
109
110 #endif /* _COMPAT_PTHREAD_H */
This page took 0.033968 seconds and 4 git commands to generate.