@@ -2611,20 +2611,57 @@ _thread_set_name_impl(PyObject *module, PyObject *name_obj)
26112611#endif
26122612
26132613 const char * name = PyBytes_AS_STRING (name_encoded );
2614+ int rc ;
26142615#ifdef __APPLE__
2615- int rc = pthread_setname_np (name );
2616+ rc = pthread_setname_np (name );
26162617#elif defined(__NetBSD__ )
26172618 pthread_t thread = pthread_self ();
2618- int rc = pthread_setname_np (thread , "%s" , (void * )name );
2619+ rc = pthread_setname_np (thread , "%s" , (void * )name );
26192620#elif defined(HAVE_PTHREAD_SETNAME_NP )
26202621 pthread_t thread = pthread_self ();
2621- int rc = pthread_setname_np (thread , name );
2622+ rc = pthread_setname_np (thread , name );
26222623#else /* defined(HAVE_PTHREAD_SET_NAME_NP) */
26232624 pthread_t thread = pthread_self ();
2624- int rc = 0 ; /* pthread_set_name_np() returns void */
2625+ rc = 0 ; /* pthread_set_name_np() returns void */
26252626 pthread_set_name_np (thread , name );
26262627#endif
26272628 Py_DECREF (name_encoded );
2629+
2630+ // Fallback: If EINVAL, try ASCII encoding with "replace"
2631+ if (rc == EINVAL ) {
2632+ name_encoded = PyUnicode_AsEncodedString (name_obj , "ascii" , "replace" );
2633+ if (name_encoded == NULL ) {
2634+ return NULL ;
2635+ }
2636+ #ifdef _PYTHREAD_NAME_MAXLEN
2637+ if (PyBytes_GET_SIZE (name_encoded ) > _PYTHREAD_NAME_MAXLEN ) {
2638+ PyObject * truncated ;
2639+ truncated = PyBytes_FromStringAndSize (PyBytes_AS_STRING (name_encoded ),
2640+ _PYTHREAD_NAME_MAXLEN );
2641+ if (truncated == NULL ) {
2642+ Py_DECREF (name_encoded );
2643+ return NULL ;
2644+ }
2645+ Py_SETREF (name_encoded , truncated );
2646+ }
2647+ #endif
2648+ name = PyBytes_AS_STRING (name_encoded );
2649+ #ifdef __APPLE__
2650+ rc = pthread_setname_np (name );
2651+ #elif defined(__NetBSD__ )
2652+ thread = pthread_self ();
2653+ rc = pthread_setname_np (thread , "%s" , (void * )name );
2654+ #elif defined(HAVE_PTHREAD_SETNAME_NP )
2655+ thread = pthread_self ();
2656+ rc = pthread_setname_np (thread , name );
2657+ #else /* defined(HAVE_PTHREAD_SET_NAME_NP) */
2658+ thread = pthread_self ();
2659+ rc = 0 ;
2660+ pthread_set_name_np (thread , name );
2661+ #endif
2662+ Py_DECREF (name_encoded );
2663+ }
2664+
26282665 if (rc ) {
26292666 errno = rc ;
26302667 return PyErr_SetFromErrno (PyExc_OSError );
0 commit comments