svn commit: r338405 - in stable/11: include lib/libc/include lib/libthr lib/libthr/thread share/man/man3

Konstantin Belousov kib at FreeBSD.org
Fri Aug 31 05:21:36 UTC 2018


Author: kib
Date: Fri Aug 31 05:21:33 2018
New Revision: 338405
URL: https://svnweb.freebsd.org/changeset/base/338405

Log:
  MFC r337983, r338044:
  Add pthread_get_name_np(3).

Modified:
  stable/11/include/pthread_np.h
  stable/11/lib/libc/include/namespace.h
  stable/11/lib/libc/include/un-namespace.h
  stable/11/lib/libthr/pthread.map
  stable/11/lib/libthr/thread/thr_exit.c
  stable/11/lib/libthr/thread/thr_info.c
  stable/11/lib/libthr/thread/thr_private.h
  stable/11/share/man/man3/Makefile
  stable/11/share/man/man3/pthread_set_name_np.3
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/include/pthread_np.h
==============================================================================
--- stable/11/include/pthread_np.h	Fri Aug 31 02:22:33 2018	(r338404)
+++ stable/11/include/pthread_np.h	Fri Aug 31 05:21:33 2018	(r338405)
@@ -47,6 +47,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: stable/11/lib/libc/include/namespace.h
==============================================================================
--- stable/11/lib/libc/include/namespace.h	Fri Aug 31 02:22:33 2018	(r338404)
+++ stable/11/lib/libc/include/namespace.h	Fri Aug 31 05:21:33 2018	(r338405)
@@ -132,6 +132,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: stable/11/lib/libc/include/un-namespace.h
==============================================================================
--- stable/11/lib/libc/include/un-namespace.h	Fri Aug 31 02:22:33 2018	(r338404)
+++ stable/11/lib/libc/include/un-namespace.h	Fri Aug 31 05:21:33 2018	(r338405)
@@ -113,6 +113,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: stable/11/lib/libthr/pthread.map
==============================================================================
--- stable/11/lib/libthr/pthread.map	Fri Aug 31 02:22:33 2018	(r338404)
+++ stable/11/lib/libthr/pthread.map	Fri Aug 31 05:21:33 2018	(r338405)
@@ -321,3 +321,7 @@ FBSD_1.4 {
 	 pthread_mutexattr_getrobust;
 	 pthread_mutexattr_setrobust;
 };
+
+FBSD_1.5 {
+	 pthread_get_name_np;
+};

Modified: stable/11/lib/libthr/thread/thr_exit.c
==============================================================================
--- stable/11/lib/libthr/thread/thr_exit.c	Fri Aug 31 02:22:33 2018	(r338404)
+++ stable/11/lib/libthr/thread/thr_exit.c	Fri Aug 31 05:21:33 2018	(r338405)
@@ -281,6 +281,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: stable/11/lib/libthr/thread/thr_info.c
==============================================================================
--- stable/11/lib/libthr/thread/thr_info.c	Fri Aug 31 02:22:33 2018	(r338404)
+++ stable/11/lib/libthr/thread/thr_info.c	Fri Aug 31 05:21:33 2018	(r338405)
@@ -1,7 +1,11 @@
 /*
  * Copyright (c) 1995-1998 John Birrell <jb at 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:
@@ -41,27 +45,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: stable/11/lib/libthr/thread/thr_private.h
==============================================================================
--- stable/11/lib/libthr/thread/thr_private.h	Fri Aug 31 02:22:33 2018	(r338404)
+++ stable/11/lib/libthr/thread/thr_private.h	Fri Aug 31 05:21:33 2018	(r338405)
@@ -570,6 +570,8 @@ struct pthread {
 	/* Sleep queue */
 	struct	sleepqueue	*sleepqueue;
 
+	/* pthread_set/get_name_np */
+	char			*name;
 };
 
 #define THR_SHOULD_GC(thrd) 						\

Modified: stable/11/share/man/man3/Makefile
==============================================================================
--- stable/11/share/man/man3/Makefile	Fri Aug 31 02:22:33 2018	(r338404)
+++ stable/11/share/man/man3/Makefile	Fri Aug 31 05:21:33 2018	(r338405)
@@ -328,6 +328,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: stable/11/share/man/man3/pthread_set_name_np.3
==============================================================================
--- stable/11/share/man/man3/pthread_set_name_np.3	Fri Aug 31 02:22:33 2018	(r338404)
+++ stable/11/share/man/man3/pthread_set_name_np.3	Fri Aug 31 05:21:33 2018	(r338405)
@@ -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 phantom at FreeBSD.org .
+.An Alexey Zelkin Aq Mt phantom at FreeBSD.org
+and
+.An Yuri Pankov Aq Mt yuripv at yuripv.net .


More information about the svn-src-stable-11 mailing list