diff options
author | Felix Janda <felix.janda@posteo.de> | 2016-09-16 20:54:00 -0400 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2016-10-20 01:48:27 -0400 |
commit | 8fb28b0b3e7a5e958fb844722a4b2ef9bc244af1 (patch) | |
tree | 87e0d423b4fffd636fd305667802243a12dd88f7 | |
parent | 3ca2d2d4aef910663785fe232d7d2127a22d8a84 (diff) | |
download | musl-8fb28b0b3e7a5e958fb844722a4b2ef9bc244af1.tar.gz musl-8fb28b0b3e7a5e958fb844722a4b2ef9bc244af1.tar.bz2 musl-8fb28b0b3e7a5e958fb844722a4b2ef9bc244af1.tar.xz musl-8fb28b0b3e7a5e958fb844722a4b2ef9bc244af1.zip |
add pthread_setname_np
the thread name is displayed by gdb's "info threads".
-rw-r--r-- | include/pthread.h | 1 | ||||
-rw-r--r-- | src/thread/pthread_setname_np.c | 26 |
2 files changed, 27 insertions, 0 deletions
diff --git a/include/pthread.h b/include/pthread.h index 3d2e0c45..94ef919c 100644 --- a/include/pthread.h +++ b/include/pthread.h @@ -214,6 +214,7 @@ struct cpu_set_t; int pthread_getaffinity_np(pthread_t, size_t, struct cpu_set_t *); int pthread_setaffinity_np(pthread_t, size_t, const struct cpu_set_t *); int pthread_getattr_np(pthread_t, pthread_attr_t *); +int pthread_setname_np(pthread_t, const char *); int pthread_tryjoin_np(pthread_t, void **); int pthread_timedjoin_np(pthread_t, void **, const struct timespec *); #endif diff --git a/src/thread/pthread_setname_np.c b/src/thread/pthread_setname_np.c new file mode 100644 index 00000000..82d35e17 --- /dev/null +++ b/src/thread/pthread_setname_np.c @@ -0,0 +1,26 @@ +#define _GNU_SOURCE +#include <fcntl.h> +#include <string.h> +#include <unistd.h> +#include <sys/prctl.h> + +#include "pthread_impl.h" + +int pthread_setname_np(pthread_t thread, const char *name) +{ + int fd, cs, status = 0; + char f[sizeof "/proc/self/task//comm" + 3*sizeof(int)]; + size_t len; + + if ((len = strnlen(name, 16)) > 15) return ERANGE; + + if (thread == pthread_self()) + return prctl(PR_SET_NAME, (unsigned long)name, 0UL, 0UL, 0UL) ? errno : 0; + + snprintf(f, sizeof f, "/proc/self/task/%d/comm", thread->tid); + pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs); + if ((fd = open(f, O_WRONLY)) < 0 || write(fd, name, len) < 0) status = errno; + if (fd >= 0) close(fd); + pthread_setcancelstate(cs, 0); + return status; +} |