vscode: Add configurations to run the executables under the debugger
[lttng-tools.git] / src / common / compat / pthread.hpp
CommitLineData
cb8d0d24
MJ
1/*
2 * Copyright (C) 2020 Michael Jeanson <mjeanson@efficios.com>
3 *
c922647d 4 * SPDX-License-Identifier: LGPL-2.1-only
cb8d0d24
MJ
5 *
6 */
7
8#ifndef _COMPAT_PTHREAD_H
9#define _COMPAT_PTHREAD_H
10
c9e313bc 11#include <common/compat/errno.hpp>
28f23191
JG
12
13#include <pthread.h>
014d7d3b
MJ
14#include <string.h>
15
3f3e7eb7
MJ
16#ifdef __FreeBSD__
17#include <pthread_np.h>
18#endif
19
014d7d3b 20#define LTTNG_PTHREAD_NAMELEN 16
cb8d0d24
MJ
21
22#if defined(HAVE_PTHREAD_SETNAME_NP_WITH_TID)
28f23191 23static inline int lttng_pthread_setname_np(const char *name)
cb8d0d24 24{
014d7d3b
MJ
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
cb8d0d24
MJ
33 return pthread_setname_np(pthread_self(), name);
34}
35#elif defined(HAVE_PTHREAD_SETNAME_NP_WITHOUT_TID)
28f23191 36static inline int lttng_pthread_setname_np(const char *name)
cb8d0d24
MJ
37{
38 return pthread_setname_np(name);
39}
014d7d3b
MJ
40#elif defined(HAVE_PTHREAD_SET_NAME_NP_WITH_TID)
41
28f23191 42static inline int lttng_pthread_setname_np(const char *name)
014d7d3b
MJ
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}
014d7d3b
MJ
52#elif defined(__linux__)
53
54/* Fallback on prtctl on Linux */
55#include <sys/prctl.h>
56
28f23191 57static inline int lttng_pthread_setname_np(const char *name)
014d7d3b
MJ
58{
59 /* Replicate pthread_setname_np's behavior. */
1571754b 60 if (strnlen(name, LTTNG_PTHREAD_NAMELEN) >= LTTNG_PTHREAD_NAMELEN) {
014d7d3b
MJ
61 return ERANGE;
62 }
63 return prctl(PR_SET_NAME, name, 0, 0, 0);
64}
cb8d0d24
MJ
65#else
66/*
67 * For platforms without thread name support, do nothing.
68 */
28f23191 69static inline int lttng_pthread_setname_np(const char *name)
cb8d0d24
MJ
70{
71 return -ENOSYS;
72}
3f3e7eb7
MJ
73#endif
74
3f3e7eb7 75#if defined(HAVE_PTHREAD_GETNAME_NP_WITH_TID)
28f23191 76static inline int lttng_pthread_getname_np(char *name, size_t len)
3f3e7eb7
MJ
77{
78 return pthread_getname_np(pthread_self(), name, len);
79}
80#elif defined(HAVE_PTHREAD_GETNAME_NP_WITHOUT_TID)
28f23191 81static inline int lttng_pthread_getname_np(char *name, size_t len)
3f3e7eb7
MJ
82{
83 return pthread_getname_np(name, len);
84}
85#elif defined(HAVE_PTHREAD_GET_NAME_NP_WITH_TID)
28f23191 86static inline int lttng_pthread_getname_np(char *name, size_t len)
3f3e7eb7
MJ
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
28f23191 96static inline int lttng_pthread_getname_np(char *name, size_t len)
3f3e7eb7
MJ
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 */
28f23191 104static inline int lttng_pthread_getname_np(char *name, size_t len)
014d7d3b
MJ
105{
106 return -ENOSYS;
107}
cb8d0d24
MJ
108#endif
109
110#endif /* _COMPAT_PTHREAD_H */
This page took 0.058909 seconds and 4 git commands to generate.