Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
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.