3737__FBSDID ("$FreeBSD$" );
3838
3939#include "namespace.h"
40+ #include <sys/errno.h>
4041#include <stdlib.h>
4142#include <string.h>
4243#include <pthread.h>
@@ -45,37 +46,64 @@ __FBSDID("$FreeBSD$");
4546
4647#include "thr_private.h"
4748
48- __weak_reference (_pthread_set_name_np , pthread_set_name_np );
49-
5049static void
51- thr_set_name_np (struct pthread * thread , const char * name )
50+ thr_set_name_np (struct pthread * thread , char * * tmp_name )
5251{
5352
5453 free (thread -> name );
55- thread -> name = name != NULL ? strdup (name ) : NULL ;
54+ thread -> name = * tmp_name ;
55+ * tmp_name = NULL ;
5656}
5757
58- /* Set the thread name for debug. */
59- void
60- _pthread_set_name_np (pthread_t thread , const char * name )
58+ /* Set the thread name. */
59+ __weak_reference (_pthread_setname_np , pthread_setname_np );
60+ int
61+ _pthread_setname_np (pthread_t thread , const char * name )
6162{
6263 struct pthread * curthread ;
64+ char * tmp_name ;
65+ int res ;
6366
67+ if (name != NULL ) {
68+ tmp_name = strdup (name );
69+ if (tmp_name == NULL )
70+ return (ENOMEM );
71+ } else {
72+ tmp_name = NULL ;
73+ }
6474 curthread = _get_curthread ();
6575 if (curthread == thread ) {
76+ res = 0 ;
6677 THR_THREAD_LOCK (curthread , thread );
67- thr_set_name (thread -> tid , name );
68- thr_set_name_np (thread , name );
78+ if (thr_set_name (thread -> tid , name ) == -1 )
79+ res = errno ;
80+ else
81+ thr_set_name_np (thread , & tmp_name );
6982 THR_THREAD_UNLOCK (curthread , thread );
7083 } else {
84+ res = ESRCH ;
7185 if (_thr_find_thread (curthread , thread , 0 ) == 0 ) {
7286 if (thread -> state != PS_DEAD ) {
73- thr_set_name (thread -> tid , name );
74- thr_set_name_np (thread , name );
87+ if (thr_set_name (thread -> tid , name ) == -1 ) {
88+ res = errno ;
89+ } else {
90+ thr_set_name_np (thread , & tmp_name );
91+ res = 0 ;
92+ }
7593 }
7694 THR_THREAD_UNLOCK (curthread , thread );
7795 }
7896 }
97+ free (tmp_name );
98+ return (res );
99+ }
100+
101+ /* Set the thread name for debug. */
102+ __weak_reference (_pthread_set_name_np , pthread_set_name_np );
103+ void
104+ _pthread_set_name_np (pthread_t thread , const char * name )
105+ {
106+ (void )_pthread_setname_np (thread , name );
79107}
80108
81109static void
@@ -88,13 +116,14 @@ thr_get_name_np(struct pthread *thread, char *buf, size_t len)
88116 buf [0 ] = '\0' ;
89117}
90118
91- __weak_reference (_pthread_get_name_np , pthread_get_name_np );
92-
93- void
94- _pthread_get_name_np (pthread_t thread , char * buf , size_t len )
119+ __weak_reference (_pthread_getname_np , pthread_getname_np );
120+ int
121+ _pthread_getname_np (pthread_t thread , char * buf , size_t len )
95122{
96123 struct pthread * curthread ;
124+ int res ;
97125
126+ res = 0 ;
98127 curthread = _get_curthread ();
99128 if (curthread == thread ) {
100129 THR_THREAD_LOCK (curthread , thread );
@@ -104,8 +133,21 @@ _pthread_get_name_np(pthread_t thread, char *buf, size_t len)
104133 if (_thr_find_thread (curthread , thread , 0 ) == 0 ) {
105134 if (thread -> state != PS_DEAD )
106135 thr_get_name_np (thread , buf , len );
136+ else
137+ res = ESRCH ;
107138 THR_THREAD_UNLOCK (curthread , thread );
108- } else if (len > 0 )
109- buf [0 ] = '\0' ;
139+ } else {
140+ res = ESRCH ;
141+ if (len > 0 )
142+ buf [0 ] = '\0' ;
143+ }
110144 }
145+ return (res );
146+ }
147+
148+ __weak_reference (_pthread_get_name_np , pthread_get_name_np );
149+ void
150+ _pthread_get_name_np (pthread_t thread , char * buf , size_t len )
151+ {
152+ (void )_pthread_getname_np (thread , buf , len );
111153}
0 commit comments