Author: kib
Date: Fri Aug 17 18:34:07 2018
New Revision: 337983
URL: https://svnweb.freebsd.org/changeset/base/337983

Log:
  Add pthread_get_name_np(3).
  
  The function retrieves the thread name previously set by
  pthread_set_name_np(3). The name is cached in the process memory.
  
  Requested by: Willem Jan Withagen <w...@digiware.nl>
  Man page update:      Yuri Pankov <yur...@yuripv.net>
  Reviewed by:  ian (previous version)
  Discussed with:       arichardson, bjk (man page)
  Sponsored by: The FreeBSD Foundation
  MFC after:    2 weeks
  Differential revision:        https://reviews.freebsd.org/D16702

Modified:
  head/include/pthread_np.h
  head/lib/libc/include/namespace.h
  head/lib/libc/include/un-namespace.h
  head/lib/libthr/pthread.map
  head/lib/libthr/thread/thr_exit.c
  head/lib/libthr/thread/thr_info.c
  head/lib/libthr/thread/thr_private.h
  head/share/man/man3/Makefile
  head/share/man/man3/pthread_set_name_np.3

Modified: head/include/pthread_np.h
==============================================================================
--- head/include/pthread_np.h   Fri Aug 17 18:32:53 2018        (r337982)
+++ head/include/pthread_np.h   Fri Aug 17 18:34:07 2018        (r337983)
@@ -49,6 +49,7 @@ int pthread_attr_setcreatesuspend_np(pthread_attr_t *)
 int pthread_attr_get_np(pthread_t, pthread_attr_t *);
 int pthread_attr_getaffinity_np(const pthread_attr_t *, size_t, cpuset_t *);
 int pthread_attr_setaffinity_np(pthread_attr_t *, size_t, const cpuset_t *);
+void pthread_get_name_np(pthread_t, char *, size_t);
 int pthread_getaffinity_np(pthread_t, size_t, cpuset_t *);
 int pthread_getthreadid_np(void);
 int pthread_main_np(void);

Modified: head/lib/libc/include/namespace.h
==============================================================================
--- head/lib/libc/include/namespace.h   Fri Aug 17 18:32:53 2018        
(r337982)
+++ head/lib/libc/include/namespace.h   Fri Aug 17 18:34:07 2018        
(r337983)
@@ -134,6 +134,7 @@
 #define                pthread_detach                  _pthread_detach
 #define                pthread_equal                   _pthread_equal
 #define                pthread_exit                    _pthread_exit
+#define                pthread_get_name_np             _pthread_get_name_np
 #define                pthread_getaffinity_np          _pthread_getaffinity_np
 #define                pthread_getconcurrency          _pthread_getconcurrency
 #define                pthread_getcpuclockid           _pthread_getcpuclockid

Modified: head/lib/libc/include/un-namespace.h
==============================================================================
--- head/lib/libc/include/un-namespace.h        Fri Aug 17 18:32:53 2018        
(r337982)
+++ head/lib/libc/include/un-namespace.h        Fri Aug 17 18:34:07 2018        
(r337983)
@@ -115,6 +115,7 @@
 #undef         pthread_detach
 #undef         pthread_equal
 #undef         pthread_exit
+#undef         pthread_get_name_np
 #undef         pthread_getaffinity_np
 #undef         pthread_getconcurrency
 #undef         pthread_getcpuclockid

Modified: head/lib/libthr/pthread.map
==============================================================================
--- head/lib/libthr/pthread.map Fri Aug 17 18:32:53 2018        (r337982)
+++ head/lib/libthr/pthread.map Fri Aug 17 18:34:07 2018        (r337983)
@@ -321,3 +321,7 @@ FBSD_1.4 {
         pthread_mutexattr_getrobust;
         pthread_mutexattr_setrobust;
 };
+
+FBSD_1.5 {
+        pthread_get_name_np;
+};

Modified: head/lib/libthr/thread/thr_exit.c
==============================================================================
--- head/lib/libthr/thread/thr_exit.c   Fri Aug 17 18:32:53 2018        
(r337982)
+++ head/lib/libthr/thread/thr_exit.c   Fri Aug 17 18:34:07 2018        
(r337983)
@@ -280,6 +280,9 @@ exit_thread(void)
 {
        struct pthread *curthread = _get_curthread();
 
+       free(curthread->name);
+       curthread->name = NULL;
+
        /* Check if there is thread specific data: */
        if (curthread->specific != NULL) {
                /* Run the thread-specific data destructors: */

Modified: head/lib/libthr/thread/thr_info.c
==============================================================================
--- head/lib/libthr/thread/thr_info.c   Fri Aug 17 18:32:53 2018        
(r337982)
+++ head/lib/libthr/thread/thr_info.c   Fri Aug 17 18:34:07 2018        
(r337983)
@@ -2,8 +2,12 @@
  * SPDX-License-Identifier: BSD-3-Clause
  *
  * Copyright (c) 1995-1998 John Birrell <j...@cimlogic.com.au>
+ * Copyright (c) 2018 The FreeBSD Foundation
  * All rights reserved.
  *
+ * Portions of this software were developed by Konstantin Belousov
+ * under sponsorship from the FreeBSD Foundation.
+ *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
@@ -43,27 +47,65 @@ __FBSDID("$FreeBSD$");
 
 __weak_reference(_pthread_set_name_np, pthread_set_name_np);
 
+static void
+thr_set_name_np(struct pthread *thread, const char *name)
+{
+
+       free(thread->name);
+       thread->name = strdup(name);
+}
+
 /* Set the thread name for debug. */
 void
 _pthread_set_name_np(pthread_t thread, const char *name)
 {
-       struct pthread *curthread = _get_curthread();
-       int ret = 0;
+       struct pthread *curthread;
 
+       curthread = _get_curthread();
        if (curthread == thread) {
-               if (thr_set_name(thread->tid, name))
-                       ret = errno;
+               THR_THREAD_LOCK(curthread, thread);
+               thr_set_name(thread->tid, name);
+               thr_set_name_np(thread, name);
+               THR_THREAD_UNLOCK(curthread, thread);
        } else {
-               if ((ret=_thr_find_thread(curthread, thread, 0)) == 0) {
+               if (_thr_find_thread(curthread, thread, 0) == 0) {
                        if (thread->state != PS_DEAD) {
-                               if (thr_set_name(thread->tid, name))
-                                       ret = errno;
+                               thr_set_name(thread->tid, name);
+                               thr_set_name_np(thread, name);
                        }
                        THR_THREAD_UNLOCK(curthread, thread);
                }
        }
-#if 0
-       /* XXX should return error code. */
-       return (ret);
-#endif
+}
+
+static void
+thr_get_name_np(struct pthread *thread, char *buf, size_t len)
+{
+
+       if (thread->name != NULL)
+               strlcpy(buf, thread->name, len);
+       else if (len > 0)
+               buf[0] = '\0';
+}
+
+__weak_reference(_pthread_get_name_np, pthread_get_name_np);
+
+void
+_pthread_get_name_np(pthread_t thread, char *buf, size_t len)
+{
+       struct pthread *curthread;
+
+       curthread = _get_curthread();
+       if (curthread == thread) {
+               THR_THREAD_LOCK(curthread, thread);
+               thr_get_name_np(thread, buf, len);
+               THR_THREAD_UNLOCK(curthread, thread);
+       } else {
+               if (_thr_find_thread(curthread, thread, 0) == 0) {
+                       if (thread->state != PS_DEAD)
+                               thr_get_name_np(thread, buf, len);
+                       THR_THREAD_UNLOCK(curthread, thread);
+               } else if (len > 0)
+                       buf[0] = '\0';
+       }
 }

Modified: head/lib/libthr/thread/thr_private.h
==============================================================================
--- head/lib/libthr/thread/thr_private.h        Fri Aug 17 18:32:53 2018        
(r337982)
+++ head/lib/libthr/thread/thr_private.h        Fri Aug 17 18:34:07 2018        
(r337983)
@@ -572,6 +572,8 @@ struct pthread {
        /* Sleep queue */
        struct  sleepqueue      *sleepqueue;
 
+       /* pthread_set/get_name_np */
+       char                    *name;
 };
 
 #define THR_SHOULD_GC(thrd)                                            \

Modified: head/share/man/man3/Makefile
==============================================================================
--- head/share/man/man3/Makefile        Fri Aug 17 18:32:53 2018        
(r337982)
+++ head/share/man/man3/Makefile        Fri Aug 17 18:34:07 2018        
(r337983)
@@ -334,6 +334,7 @@ PTHREAD_MLINKS+=pthread_rwlock_rdlock.3 pthread_rwlock
 PTHREAD_MLINKS+=pthread_rwlock_wrlock.3 pthread_rwlock_trywrlock.3
 PTHREAD_MLINKS+=pthread_schedparam.3 pthread_getschedparam.3 \
                pthread_schedparam.3 pthread_setschedparam.3
+PTHREAD_MLINKS+=pthread_set_name_np.3 pthread_get_name_np.3
 PTHREAD_MLINKS+=pthread_spin_init.3 pthread_spin_destroy.3 \
                pthread_spin_lock.3 pthread_spin_trylock.3 \
                pthread_spin_lock.3 pthread_spin_unlock.3

Modified: head/share/man/man3/pthread_set_name_np.3
==============================================================================
--- head/share/man/man3/pthread_set_name_np.3   Fri Aug 17 18:32:53 2018        
(r337982)
+++ head/share/man/man3/pthread_set_name_np.3   Fri Aug 17 18:34:07 2018        
(r337983)
@@ -24,17 +24,20 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd December 2, 2016
+.Dd August 12, 2018
 .Dt PTHREAD_SET_NAME_NP 3
 .Os
 .Sh NAME
+.Nm pthread_get_name_np ,
 .Nm pthread_set_name_np
-.Nd set the thread name
+.Nd set and retrieve the thread name
 .Sh LIBRARY
 .Lb libpthread
 .Sh SYNOPSIS
 .In pthread_np.h
 .Ft void
+.Fn pthread_get_name_np "pthread_t thread" "char *name" "size_t len"
+.Ft void
 .Fn pthread_set_name_np "pthread_t thread" "const char *name"
 .Sh DESCRIPTION
 The
@@ -43,11 +46,32 @@ function applies a copy of the given
 .Fa name
 to the given
 .Fa thread .
+.Pp
+The
+.Fn pthread_get_name_np
+function retrieves the
+.Fa name
+associated with
+.Fa thread .
+If
+.Fn pthread_set_name_np
+was not previously called for
+.Fa thread ,
+the buffer pointed to by
+.Fa name
+will be empty.
 .Sh ERRORS
-Because of the debugging nature of this function, all errors that may
+Because of the debugging nature of these functions, all errors that may
 appear inside are silently ignored.
 .Sh SEE ALSO
 .Xr thr_set_name 2
+.Sh STANDARDS
+.Fn pthread_set_name_np
+and
+.Fn pthread_get_name_np
+are non-standard extensions.
 .Sh AUTHORS
 This manual page was written by
-.An Alexey Zelkin Aq Mt phan...@freebsd.org .
+.An Alexey Zelkin Aq Mt phan...@freebsd.org
+and
+An Yuri Pankov Aq Mt yur...@yuripv.net .
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to