xref: /freebsd/lib/libthr/thread/thr_info.c (revision f8bbbce458194ff4312c610d32a64ff4a3a71d45)
18a16b7a1SPedro F. Giffuni /*-
28a16b7a1SPedro F. Giffuni  * SPDX-License-Identifier: BSD-3-Clause
38a16b7a1SPedro F. Giffuni  *
4bb535300SJeff Roberson  * Copyright (c) 1995-1998 John Birrell <jb@cimlogic.com.au>
54627d47bSKonstantin Belousov  * Copyright (c) 2018 The FreeBSD Foundation
6bb535300SJeff Roberson  * All rights reserved.
7bb535300SJeff Roberson  *
84627d47bSKonstantin Belousov  * Portions of this software were developed by Konstantin Belousov
94627d47bSKonstantin Belousov  * under sponsorship from the FreeBSD Foundation.
104627d47bSKonstantin Belousov  *
11bb535300SJeff Roberson  * Redistribution and use in source and binary forms, with or without
12bb535300SJeff Roberson  * modification, are permitted provided that the following conditions
13bb535300SJeff Roberson  * are met:
14bb535300SJeff Roberson  * 1. Redistributions of source code must retain the above copyright
15bb535300SJeff Roberson  *    notice, this list of conditions and the following disclaimer.
16bb535300SJeff Roberson  * 2. Redistributions in binary form must reproduce the above copyright
17bb535300SJeff Roberson  *    notice, this list of conditions and the following disclaimer in the
18bb535300SJeff Roberson  *    documentation and/or other materials provided with the distribution.
19fed32d75SWarner Losh  * 3. Neither the name of the author nor the names of any co-contributors
20bb535300SJeff Roberson  *    may be used to endorse or promote products derived from this software
21bb535300SJeff Roberson  *    without specific prior written permission.
22bb535300SJeff Roberson  *
23bb535300SJeff Roberson  * THIS SOFTWARE IS PROVIDED BY JOHN BIRRELL AND CONTRIBUTORS ``AS IS'' AND
24bb535300SJeff Roberson  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25bb535300SJeff Roberson  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26bb535300SJeff Roberson  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
27bb535300SJeff Roberson  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28bb535300SJeff Roberson  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29bb535300SJeff Roberson  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30bb535300SJeff Roberson  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31bb535300SJeff Roberson  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32bb535300SJeff Roberson  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33bb535300SJeff Roberson  * SUCH DAMAGE.
34bb535300SJeff Roberson  */
35a091d823SDavid Xu 
3637a6356bSDavid Xu #include "namespace.h"
372ef84b7dSKonstantin Belousov #include <sys/errno.h>
38bb535300SJeff Roberson #include <stdlib.h>
39bb535300SJeff Roberson #include <string.h>
4037a6356bSDavid Xu #include <pthread.h>
4137a6356bSDavid Xu #include <pthread_np.h>
4237a6356bSDavid Xu #include "un-namespace.h"
43a091d823SDavid Xu 
44bb535300SJeff Roberson #include "thr_private.h"
45bb535300SJeff Roberson 
464627d47bSKonstantin Belousov static void
thr_set_name_np(struct pthread * thread,char ** tmp_name)472ef84b7dSKonstantin Belousov thr_set_name_np(struct pthread *thread, char **tmp_name)
484627d47bSKonstantin Belousov {
494627d47bSKonstantin Belousov 
504627d47bSKonstantin Belousov 	free(thread->name);
512ef84b7dSKonstantin Belousov 	thread->name = *tmp_name;
522ef84b7dSKonstantin Belousov 	*tmp_name = NULL;
532ef84b7dSKonstantin Belousov }
542ef84b7dSKonstantin Belousov 
552ef84b7dSKonstantin Belousov /* Set the thread name. */
562ef84b7dSKonstantin Belousov __weak_reference(_pthread_setname_np, pthread_setname_np);
572ef84b7dSKonstantin Belousov int
_pthread_setname_np(pthread_t thread,const char * name)582ef84b7dSKonstantin Belousov _pthread_setname_np(pthread_t thread, const char *name)
592ef84b7dSKonstantin Belousov {
602ef84b7dSKonstantin Belousov 	struct pthread *curthread;
612ef84b7dSKonstantin Belousov 	char *tmp_name;
622ef84b7dSKonstantin Belousov 	int res;
632ef84b7dSKonstantin Belousov 
642ef84b7dSKonstantin Belousov 	if (name != NULL) {
652ef84b7dSKonstantin Belousov 		tmp_name = strdup(name);
662ef84b7dSKonstantin Belousov 		if (tmp_name == NULL)
672ef84b7dSKonstantin Belousov 			return (ENOMEM);
682ef84b7dSKonstantin Belousov 	} else {
692ef84b7dSKonstantin Belousov 		tmp_name = NULL;
702ef84b7dSKonstantin Belousov 	}
712ef84b7dSKonstantin Belousov 	curthread = _get_curthread();
722ef84b7dSKonstantin Belousov 	if (curthread == thread) {
732ef84b7dSKonstantin Belousov 		res = 0;
742ef84b7dSKonstantin Belousov 		THR_THREAD_LOCK(curthread, thread);
752ef84b7dSKonstantin Belousov 		if (thr_set_name(thread->tid, name) == -1)
762ef84b7dSKonstantin Belousov 			res = errno;
772ef84b7dSKonstantin Belousov 		else
782ef84b7dSKonstantin Belousov 			thr_set_name_np(thread, &tmp_name);
792ef84b7dSKonstantin Belousov 		THR_THREAD_UNLOCK(curthread, thread);
802ef84b7dSKonstantin Belousov 	} else {
812ef84b7dSKonstantin Belousov 		res = ESRCH;
822ef84b7dSKonstantin Belousov 		if (_thr_find_thread(curthread, thread, 0) == 0) {
832ef84b7dSKonstantin Belousov 			if (thread->state != PS_DEAD) {
842ef84b7dSKonstantin Belousov 				if (thr_set_name(thread->tid, name) == -1) {
852ef84b7dSKonstantin Belousov 					res = errno;
862ef84b7dSKonstantin Belousov 				} else {
872ef84b7dSKonstantin Belousov 					thr_set_name_np(thread, &tmp_name);
882ef84b7dSKonstantin Belousov 					res = 0;
892ef84b7dSKonstantin Belousov 				}
902ef84b7dSKonstantin Belousov 			}
912ef84b7dSKonstantin Belousov 			THR_THREAD_UNLOCK(curthread, thread);
922ef84b7dSKonstantin Belousov 		}
932ef84b7dSKonstantin Belousov 	}
942ef84b7dSKonstantin Belousov 	free(tmp_name);
952ef84b7dSKonstantin Belousov 	return (res);
964627d47bSKonstantin Belousov }
974627d47bSKonstantin Belousov 
98e35e2ebdSDavid Xu /* Set the thread name for debug. */
992ef84b7dSKonstantin Belousov __weak_reference(_pthread_set_name_np, pthread_set_name_np);
100bb535300SJeff Roberson void
_pthread_set_name_np(pthread_t thread,const char * name)10137a6356bSDavid Xu _pthread_set_name_np(pthread_t thread, const char *name)
102bb535300SJeff Roberson {
1032ef84b7dSKonstantin Belousov 	(void)_pthread_setname_np(thread, name);
1044627d47bSKonstantin Belousov }
1054627d47bSKonstantin Belousov 
1064627d47bSKonstantin Belousov static void
thr_get_name_np(struct pthread * thread,char * buf,size_t len)1074627d47bSKonstantin Belousov thr_get_name_np(struct pthread *thread, char *buf, size_t len)
1084627d47bSKonstantin Belousov {
1094627d47bSKonstantin Belousov 
1104627d47bSKonstantin Belousov 	if (thread->name != NULL)
1114627d47bSKonstantin Belousov 		strlcpy(buf, thread->name, len);
1124627d47bSKonstantin Belousov 	else if (len > 0)
1134627d47bSKonstantin Belousov 		buf[0] = '\0';
1144627d47bSKonstantin Belousov }
1154627d47bSKonstantin Belousov 
116*0dc52b72SMinsoo Choo __weak_reference(_thr_getname_np, pthread_getname_np);
117*0dc52b72SMinsoo Choo __weak_reference(_thr_getname_np, _pthread_getname_np);
1182ef84b7dSKonstantin Belousov int
_thr_getname_np(pthread_t thread,char * buf,size_t len)119*0dc52b72SMinsoo Choo _thr_getname_np(pthread_t thread, char *buf, size_t len)
1204627d47bSKonstantin Belousov {
1214627d47bSKonstantin Belousov 	struct pthread *curthread;
1222ef84b7dSKonstantin Belousov 	int res;
1234627d47bSKonstantin Belousov 
1242ef84b7dSKonstantin Belousov 	res = 0;
1254627d47bSKonstantin Belousov 	curthread = _get_curthread();
1264627d47bSKonstantin Belousov 	if (curthread == thread) {
1274627d47bSKonstantin Belousov 		THR_THREAD_LOCK(curthread, thread);
1284627d47bSKonstantin Belousov 		thr_get_name_np(thread, buf, len);
1294627d47bSKonstantin Belousov 		THR_THREAD_UNLOCK(curthread, thread);
1304627d47bSKonstantin Belousov 	} else {
1314627d47bSKonstantin Belousov 		if (_thr_find_thread(curthread, thread, 0) == 0) {
1324627d47bSKonstantin Belousov 			if (thread->state != PS_DEAD)
1334627d47bSKonstantin Belousov 				thr_get_name_np(thread, buf, len);
1342ef84b7dSKonstantin Belousov 			else
1352ef84b7dSKonstantin Belousov 				res = ESRCH;
1364627d47bSKonstantin Belousov 			THR_THREAD_UNLOCK(curthread, thread);
1372ef84b7dSKonstantin Belousov 		} else {
1382ef84b7dSKonstantin Belousov 			res = ESRCH;
1392ef84b7dSKonstantin Belousov 			if (len > 0)
1404627d47bSKonstantin Belousov 				buf[0] = '\0';
1414627d47bSKonstantin Belousov 		}
142bb535300SJeff Roberson 	}
1432ef84b7dSKonstantin Belousov 	return (res);
1442ef84b7dSKonstantin Belousov }
1452ef84b7dSKonstantin Belousov 
1462ef84b7dSKonstantin Belousov __weak_reference(_pthread_get_name_np, pthread_get_name_np);
1472ef84b7dSKonstantin Belousov void
_pthread_get_name_np(pthread_t thread,char * buf,size_t len)1482ef84b7dSKonstantin Belousov _pthread_get_name_np(pthread_t thread, char *buf, size_t len)
1492ef84b7dSKonstantin Belousov {
150*0dc52b72SMinsoo Choo 	(void)_thr_getname_np(thread, buf, len);
1512ef84b7dSKonstantin Belousov }
152