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]

Re: [PATCH 1/2] Add pthread_getname_np and pthread_setname_np


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]