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