aboutsummaryrefslogtreecommitdiff
path: root/src/unix/thread.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/unix/thread.c')
-rw-r--r--src/unix/thread.c92
1 files changed, 92 insertions, 0 deletions
diff --git a/src/unix/thread.c b/src/unix/thread.c
index 4d6ddc2b..e51c2904 100644
--- a/src/unix/thread.c
+++ b/src/unix/thread.c
@@ -23,6 +23,9 @@
#include "internal.h"
#include <pthread.h>
+#ifdef __OpenBSD__
+#include <pthread_np.h>
+#endif
#include <assert.h>
#include <errno.h>
@@ -297,6 +300,18 @@ int uv_thread_equal(const uv_thread_t* t1, const uv_thread_t* t2) {
return pthread_equal(*t1, *t2);
}
+int uv_thread_setname(const char* name) {
+ if (name == NULL)
+ return UV_EINVAL;
+ return uv__thread_setname(name);
+}
+
+int uv_thread_getname(uv_thread_t* tid, char* name, size_t size) {
+ if (name == NULL || size == 0)
+ return UV_EINVAL;
+
+ return uv__thread_getname(tid, name, size);
+}
int uv_mutex_init(uv_mutex_t* mutex) {
#if defined(NDEBUG) || !defined(PTHREAD_MUTEX_ERRORCHECK)
@@ -881,3 +896,80 @@ void uv_key_set(uv_key_t* key, void* value) {
if (pthread_setspecific(*key, value))
abort();
}
+
+#if defined(_AIX) || defined(__MVS__) || defined(__PASE__)
+int uv__thread_setname(const char* name) {
+ return UV_ENOSYS;
+}
+#elif defined(__APPLE__)
+int uv__thread_setname(const char* name) {
+ char namebuf[UV_PTHREAD_MAX_NAMELEN_NP];
+ strncpy(namebuf, name, sizeof(namebuf) - 1);
+ namebuf[sizeof(namebuf) - 1] = '\0';
+ int err = pthread_setname_np(namebuf);
+ if (err)
+ return UV__ERR(errno);
+ return 0;
+}
+#elif defined(__NetBSD__)
+int uv__thread_setname(const char* name) {
+ char namebuf[UV_PTHREAD_MAX_NAMELEN_NP];
+ strncpy(namebuf, name, sizeof(namebuf) - 1);
+ namebuf[sizeof(namebuf) - 1] = '\0';
+ return UV__ERR(pthread_setname_np(pthread_self(), "%s", namebuf));
+}
+#elif defined(__OpenBSD__)
+int uv__thread_setname(const char* name) {
+ char namebuf[UV_PTHREAD_MAX_NAMELEN_NP];
+ strncpy(namebuf, name, sizeof(namebuf) - 1);
+ namebuf[sizeof(namebuf) - 1] = '\0';
+ pthread_set_name_np(pthread_self(), namebuf);
+ return 0;
+}
+#else
+int uv__thread_setname(const char* name) {
+ char namebuf[UV_PTHREAD_MAX_NAMELEN_NP];
+ strncpy(namebuf, name, sizeof(namebuf) - 1);
+ namebuf[sizeof(namebuf) - 1] = '\0';
+ return UV__ERR(pthread_setname_np(pthread_self(), namebuf));
+}
+#endif
+
+#if (defined(__ANDROID_API__) && __ANDROID_API__ < 26) || \
+ defined(_AIX) || \
+ defined(__MVS__) || \
+ defined(__PASE__)
+int uv__thread_getname(uv_thread_t* tid, char* name, size_t size) {
+ return UV_ENOSYS;
+}
+#elif defined(__OpenBSD__)
+int uv__thread_getname(uv_thread_t* tid, char* name, size_t size) {
+ char thread_name[UV_PTHREAD_MAX_NAMELEN_NP];
+ pthread_get_name_np(*tid, thread_name, sizeof(thread_name));
+ strncpy(name, thread_name, size - 1);
+ name[size - 1] = '\0';
+ return 0;
+}
+#elif defined(__APPLE__)
+int uv__thread_getname(uv_thread_t* tid, char* name, size_t size) {
+ char thread_name[UV_PTHREAD_MAX_NAMELEN_NP];
+ if (pthread_getname_np(*tid, thread_name, sizeof(thread_name)) != 0)
+ return UV__ERR(errno);
+
+ strncpy(name, thread_name, size - 1);
+ name[size - 1] = '\0';
+ return 0;
+}
+#else
+int uv__thread_getname(uv_thread_t* tid, char* name, size_t size) {
+ int r;
+ char thread_name[UV_PTHREAD_MAX_NAMELEN_NP];
+ r = pthread_getname_np(*tid, thread_name, sizeof(thread_name));
+ if (r != 0)
+ return UV__ERR(r);
+
+ strncpy(name, thread_name, size - 1);
+ name[size - 1] = '\0';
+ return 0;
+}
+#endif