[PATCH 1/2] Add pthread_getname_np and pthread_setname_np
Corinna Vinschen
corinna-cygwin@cygwin.com
Thu Jul 28 19:21:00 GMT 2016
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
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <http://cygwin.com/pipermail/cygwin-patches/attachments/20160728/4aae3133/attachment.sig>
More information about the Cygwin-patches
mailing list