This is the mail archive of the cygwin-patches mailing list for the Cygwin project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
Hi Jon, On Jul 28 12:43, Jon Turney wrote: > This patch adds pthread_getname_np and pthread_setname_np. > > These were added to glibc in 2.12[1] and are also present in some form on > NetBSD and several UNIXes. > > The code is based on NetBSD's implementation with changes to better match > Linux behaviour. > > Implementation quirks: > > * pthread_setname_np with a NULL pointer segfaults (as linux) > > * pthread_setname_np accepts names longer than 16 characters (linux returns > ERANGE) Given the behaviour of pthread_getname_np we should do the same, I think. > * pthread_getname_np with a NULL pointer returns EFAULT (as linux) > > * pthread_getname_np with a buffer length of less than 16 returns ERANGE (as > linux) > > * pthread_getname_np truncates the thread name to fit the buffer length. > This guarantees success even when the default thread name is longer than 16 > characters, but means there is no way to discover the actual length of the > thread name. (Linux always truncates the thread name to 16 characters) > > * Changing program_invocation_short_name changes the default thread name. > > I'll leave it up to you to decide any of these matter. > > This is implemented via class pthread_attr to make it easier to add > pthread_attr_[gs]etname_np (present in NetBSD and some UNIXes) should it > ever be added to Linux (or we decide we want it anyway). Good thinking. > [1] https://sourceware.org/git/?p=glibc.git;a=blob;f=NEWS;h=d55a844d4ec06d164cb786c6c9f403a9672a674d;hb=e28c88707ef0529593fccedf1a94c3fce3df0ef3 > > diff --git a/winsup/cygwin/include/cygwin/version.h b/winsup/cygwin/include/cygwin/version.h > index 1f5bf72..d403f0e 100644 > --- a/winsup/cygwin/include/cygwin/version.h > +++ b/winsup/cygwin/include/cygwin/version.h > @@ -454,12 +454,13 @@ details. */ > nexttowardf, nexttowardl, pow10l, powl, remainderl, remquol, roundl, > scalbl, scalblnl, scalbnl, sincosl, sinhl, sinl, tanhl, tanl, > tgammal, truncl. > + 298: Export pthread_getname_np, pthread_setname_np. Yuk! This collides with my changes in topic/locales. Oh well, nothing we can do about it... > --- a/winsup/cygwin/thread.cc > +++ b/winsup/cygwin/thread.cc > @@ -1099,7 +1099,7 @@ pthread::resume () > pthread_attr::pthread_attr ():verifyable_object (PTHREAD_ATTR_MAGIC), > joinable (PTHREAD_CREATE_JOINABLE), contentionscope (PTHREAD_SCOPE_PROCESS), > inheritsched (PTHREAD_INHERIT_SCHED), stackaddr (NULL), stacksize (0), > -guardsize (wincap.def_guard_page_size ()) > +guardsize (wincap.def_guard_page_size ()), name (NULL) > { > schedparam.sched_priority = 0; > } > @@ -2569,6 +2569,65 @@ pthread_getattr_np (pthread_t thread, pthread_attr_t *attr) > return 0; > } > > +#define NAMELEN 16 > + > +extern "C" int > +pthread_getname_np (pthread_t thread, char *buf, size_t buflen) > +{ > + char *name; > + > + if (!pthread::is_good_object (&thread)) > + return ESRCH; > + > + if (!thread->attr.name) > + name = program_invocation_short_name; > + else > + name = thread->attr.name; > + > + // Return ERANGE if the provided buffer is less than NAMELEN. Truncate and > + // zero-terminate the name to fit in buf. This means we always return > + // something if the buffer is NAMELEN or larger, but there is no way to tell > + // if we have the whole name. Please use C-style /* */ bracketing for multiline comments. > + if (buflen < NAMELEN) > + return ERANGE; > + > + int ret = 0; > + __try > + { > + strlcpy (buf, name, buflen); > + } > + __except (NO_ERROR) > + { > + ret = EFAULT; > + } > + __endtry > + > + return ret; > +} > + > +#undef NAMELEN > + > +extern "C" int > +pthread_setname_np (pthread_t thread, const char *name) > +{ > + char *oldname, *cp; > + > + if (!pthread::is_good_object (&thread)) > + return ESRCH; > + > + cp = strdup(name); ^^^ space? > + if (!cp) > + return ENOMEM; > + > + oldname = thread->attr.name; > + thread->attr.name = cp; > + > + if (oldname) > + free(oldname); ^^^ space? Looks good, otherwise. Thanks, Corinna -- Corinna Vinschen Please, send mails regarding Cygwin to Cygwin Maintainer cygwin AT cygwin DOT com Red Hat
Attachment:
signature.asc
Description: PGP signature
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |