|
Message-ID: <20160916150038.GM15995@brightrain.aerifal.cx> Date: Fri, 16 Sep 2016 11:00:38 -0400 From: Rich Felker <dalias@...c.org> To: musl@...ts.openwall.com Subject: Re: [PATCH] add pthread_setname_np On Fri, Sep 16, 2016 at 12:03:16PM +0300, Alexander Monakov wrote: > 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) Yep. > > +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()? My preference when implementing nonstandard extension/junk functions that are not performance-critical is to write them using nothing but public APIs so that they're musl-agnostic and thereby maintenance-free. Certainly saving a few bytes/cycles for the function call here is not worthwhile so I'd stick with 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 See above. This would be smaller but if we (or someone else using the code) wanted to change the conventions of how __syscall is used, this would require them to dig info nonstandard functions (which don't _need_ to be using __syscall) in addition to all the standard ones (which might need to do this for namespace reasons, etc.). So I'd prefer just using the public interface. > 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; > > +} I don't have a strong opinion on how this part is structured. Rich
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.