|
Message-ID: <alpine.LNX.2.20.13.1609161117360.30232@monopod.intra.ispras.ru> Date: Fri, 16 Sep 2016 12:03:16 +0300 (MSK) From: Alexander Monakov <amonakov@...ras.ru> To: musl@...ts.openwall.com Subject: Re: [PATCH] add pthread_setname_np Hi, On Thu, 15 Sep 2016, Felix Janda wrote: > --- /dev/null > +++ b/src/thread/pthread_setname_np.c > @@ -0,0 +1,25 @@ > +#include <fcntl.h> > +#include <string.h> > +#include <unistd.h> > +#include <sys/prctl.h> > + > +#include "pthread_impl.h" This should bring in the declaration of pthread_setname_np from pthread.h by #defin'ing _GNU_SOURCE prior to inclusion. (today, this rule is not enforced with warnings and thus not always followed in musl, for example the recent pthread_tryjoin_np patch missed that as well) > +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()) This likely should use the static inline function __pthread_self()? > + return prctl(PR_SET_NAME, (unsigned long)name, 0, 0, 0) ? errno : 0; First, prctl is declared as a variadic function, so zeros should be passed with the right type (0ul); passing fewer than 5 arguments will cause musl's implementation of prctl to invoke UB, since it always retrieves 4 variadic arguments. Second, while I don't have a strong opinion on whether musl wants to use prctl here (my previous comment in this thread was based on the wrong idea that prctl would be sufficient in all cases - sorry about that), I think some tuning would be nice in case the decision is to use prctl. So, either return -__syscall(SYS_prctl, PR_SET_NAME, name); (not sure if Rich would like it), or if (thread == pthread_self()) { status = prctl(...); } else { ... fd = status = open(f, O_WRONLY); if (fd >= 0) { status = write(fd, name, len); close(fd); } pthread_setcancelstate(cs, 0); } return status ? 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; > +} Thanks. Alexander
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.