|
|
Message-ID: <68dedc6479ed7a6bbce271a6de3fba6c@agner.ch>
Date: Thu, 20 May 2021 15:04:36 +0200
From: Stefan Agner <stefan@...er.ch>
To: musl@...ts.openwall.com
Cc: Érico Rolim <ericonr@...root.org>
Subject: Re: [PATCH] add pthread_getname_np function
Hi,
On 2021-04-20 21:15, Érico Nogueira wrote:
> From: Érico Rolim <ericonr@...root.org>
>
> based on the pthread_setname_np implementation
> ---
>
> I might have forgotten to send this final version here
>
> include/pthread.h | 1 +
> src/thread/pthread_getname_np.c | 25 +++++++++++++++++++++++++
> 2 files changed, 26 insertions(+)
> create mode 100644 src/thread/pthread_getname_np.c
>
> diff --git a/include/pthread.h b/include/pthread.h
> index 0492f26a..89fd9ff7 100644
> --- a/include/pthread.h
> +++ b/include/pthread.h
> @@ -221,6 +221,7 @@ 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_getname_np(pthread_t, char *, size_t);
> int pthread_getattr_default_np(pthread_attr_t *);
> int pthread_setattr_default_np(const pthread_attr_t *);
> int pthread_tryjoin_np(pthread_t, void **);
> diff --git a/src/thread/pthread_getname_np.c b/src/thread/pthread_getname_np.c
> new file mode 100644
> index 00000000..48d1a294
> --- /dev/null
> +++ b/src/thread/pthread_getname_np.c
> @@ -0,0 +1,25 @@
> +#define _GNU_SOURCE
> +#include <fcntl.h>
> +#include <unistd.h>
> +#include <sys/prctl.h>
> +
> +#include "pthread_impl.h"
> +
> +int pthread_getname_np(pthread_t thread, char *name, size_t len)
> +{
> + int fd, cs, status = 0;
> + char f[sizeof "/proc/self/task//comm" + 3*sizeof(int)];
> +
> + if (len < 16) return ERANGE;
> +
> + if (thread == pthread_self())
> + return prctl(PR_GET_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_RDONLY|O_CLOEXEC)) < 0 || (len = read(fd, name,
> len)) < 0) status = errno;
> + else name[len-1] = 0; /* remove trailing new line only if successful */
It seems that Linux indeed always adds a newline, so removing it
unconditionally seems fine.
> + if (fd >= 0) close(fd);
> + pthread_setcancelstate(cs, 0);
> + return status;
> +}
Looks good to me:
Reviewed-by: Stefan Agner <stefan@...er.ch>
FWIW, We carry basically the same patch for musl to build TensorFlow and
I was about to post it.
--
Stefan
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.