@@ -75,93 +75,61 @@ get_thread_state_by_cls(PyTypeObject *cls)
7575    return  get_thread_state (module );
7676}
7777
78+ // Helper to set the thread name using platform-specific APIs 
7879static  int 
79- set_thread_name_with_encoding ( PyObject   * name_obj ,  const  char  * encoding )
80+ set_native_thread_name ( const  char  * name )
8081{
81-     PyObject  * name_encoded  =  NULL ;
82- 
83- #ifndef  MS_WINDOWS 
84-     /* Determine encoding to use. If encoding arg is NULL, use FS codec. */ 
85-     const  char  * enc  =  encoding ;
86- #ifdef  __sun 
87-     enc  =  "utf-8" ;  /* Solaris always uses UTF-8 */ 
88- #else 
89-     if  (enc  ==  NULL ) {
90-         PyInterpreterState  * interp  =  _PyInterpreterState_GET ();
91-         enc  =  interp -> unicode .fs_codec .encoding ;
92-     }
93- #endif 
94- 
95-     name_encoded  =  PyUnicode_AsEncodedString (name_obj , enc , "replace" );
96-     if  (name_encoded  ==  NULL ) {
97-         return  -1 ; /* Python exception set */ 
98-     }
99- 
100- #ifdef  _PYTHREAD_NAME_MAXLEN 
101-     /* Truncate to _PYTHREAD_NAME_MAXLEN bytes if needed */ 
102-     if  (PyBytes_GET_SIZE (name_encoded ) >  _PYTHREAD_NAME_MAXLEN ) {
103-         PyObject  * truncated  =  PyBytes_FromStringAndSize (
104-                                 PyBytes_AS_STRING (name_encoded ),
105-                                 _PYTHREAD_NAME_MAXLEN );
106-         if  (truncated  ==  NULL ) {
107-             Py_DECREF (name_encoded );
108-             return  -1 ; /* Python exception set */ 
109-         }
110-         Py_SETREF (name_encoded , truncated );
111-     }
112- #endif 
113- 
114-     const  char  * name  =  PyBytes_AS_STRING (name_encoded );
115- 
82+     int  rc ;
11683#ifdef  __APPLE__ 
117-     int   rc  =  pthread_setname_np (name );
84+     rc  =  pthread_setname_np (name );
11885#elif  defined(__NetBSD__ )
11986    pthread_t  thread  =  pthread_self ();
120-     int   rc  =  pthread_setname_np (thread , "%s" , (void  * )name );
87+     rc  =  pthread_setname_np (thread , "%s" , (void  * )name );
12188#elif  defined(HAVE_PTHREAD_SETNAME_NP )
12289    pthread_t  thread  =  pthread_self ();
123-     int  rc  =  pthread_setname_np (thread , name );
124- #else 
125-     /* pthread_set_name_np() (void) on some platforms */ 
90+     rc  =  pthread_setname_np (thread , name );
91+ #elif  defined(HAVE_PTHREAD_SET_NAME_NP )
12692    pthread_t  thread  =  pthread_self ();
127-     int  rc  =  0 ;
12893    pthread_set_name_np (thread , name );
94+     rc  =  0 ; /* pthread_set_name_np() returns void */ 
12995#endif 
96+     return  rc ;
97+ }
13098
131-     Py_DECREF (name_encoded );
132-     return  rc ; /* 0 on success, errno-style >0 on error */ 
133- #else 
134-     /* Windows: convert to wide string and call SetThreadDescription */ 
135-     assert (pSetThreadDescription  !=  NULL );
136-     Py_ssize_t  len ;
137-     wchar_t  * wname  =  PyUnicode_AsWideCharString (name_obj , & len );
138-     if  (wname  ==  NULL ) {
139-         return  -1 ; /* Python exception set */ 
99+ // Helper to encode and truncate thread name 
100+ static  PyObject  * 
101+ encode_thread_name (PyObject  * name_obj , const  char  * encoding )
102+ {
103+ #ifdef  __sun 
104+     // Solaris always uses UTF-8 
105+     encoding  =  "utf-8" ;
106+ #endif 
107+     PyObject  * name_encoded  =  PyUnicode_AsEncodedString (name_obj , encoding , "replace" );
108+     if  (name_encoded  ==  NULL ) {
109+         return  NULL ;
140110    }
141- 
142-     /* Truncate if necessary (len is number of wchar_t characters) */ 
143111#ifdef  _PYTHREAD_NAME_MAXLEN 
144-     if  (len  >  _PYTHREAD_NAME_MAXLEN ) {
145-         /* Ensure we null-terminate safely. Use maxlen as max characters allowed. */ 
146-         /* If the char at max-1 is a high surrogate, avoid chopping the surrogate pair. */ 
147-         Py_UCS4  ch  =  (Py_UCS4 )wname [_PYTHREAD_NAME_MAXLEN  -  1 ];
148-         if  (Py_UNICODE_IS_HIGH_SURROGATE (ch ) &&  _PYTHREAD_NAME_MAXLEN  >= 2 ) {
149-             wname [_PYTHREAD_NAME_MAXLEN  -  1 ] =  L'\0' ;
150-         } else  {
151-             wname [_PYTHREAD_NAME_MAXLEN ] =  L'\0' ;
152-         }
112+     if  (PyBytes_GET_SIZE (name_encoded ) >  _PYTHREAD_NAME_MAXLEN ) {
113+         PyObject  * truncated  =  PyBytes_FromStringAndSize (PyBytes_AS_STRING (name_encoded ), _PYTHREAD_NAME_MAXLEN );
114+         Py_DECREF (name_encoded );
115+         return  truncated ;
153116    }
154117#endif 
118+     return  name_encoded ;
119+ }
155120
156-     HRESULT  hr  =  pSetThreadDescription (GetCurrentThread (), wname );
157-     PyMem_Free (wname );
158-     if  (FAILED (hr )) {
159-         /* Convert to a Python exception and return -1 so caller propagates it */ 
160-         PyErr_SetFromWindowsErr ((int )hr );
161-         return  -1 ;
121+ // Helper to encode, set, and cleanup thread name in one step 
122+ static  int 
123+ set_thread_name_with_encoding (PyObject  * name_obj , const  char  * encoding )
124+ {
125+     PyObject  * name_encoded  =  encode_thread_name (name_obj , encoding );
126+     if  (name_encoded  ==  NULL ) {
127+         return  -1 ; // error, exception set 
162128    }
163-     return  0 ;
164- #endif 
129+     const  char  * name  =  PyBytes_AS_STRING (name_encoded );
130+     int  rc  =  set_native_thread_name (name );
131+     Py_DECREF (name_encoded );
132+     return  rc ;
165133}
166134
167135#ifdef  MS_WINDOWS 
0 commit comments