@@ -2226,6 +2226,22 @@ tstate_try_attach(PyThreadState *tstate)
22262226#endif
22272227}
22282228
2229+ static int
2230+ tstate_try_attach_detached (PyThreadState * tstate , int * state )
2231+ {
2232+ #ifdef Py_GIL_DISABLED
2233+ assert (* state == _Py_THREAD_DETACHED ||
2234+ * state == _Py_THREAD_DETACHED_WAITING );
2235+ return _Py_atomic_compare_exchange_int (& tstate -> state ,
2236+ state ,
2237+ _Py_THREAD_ATTACHED );
2238+ #else
2239+ assert (tstate -> state == _Py_THREAD_DETACHED );
2240+ tstate -> state = _Py_THREAD_ATTACHED ;
2241+ return 1 ;
2242+ #endif
2243+ }
2244+
22292245static void
22302246tstate_set_detached (PyThreadState * tstate , int detached_state )
22312247{
@@ -2264,9 +2280,7 @@ tstate_wait_attach(PyThreadState *tstate)
22642280 else {
22652281 assert (state == _Py_THREAD_DETACHED ||
22662282 state == _Py_THREAD_DETACHED_WAITING );
2267- if (_Py_atomic_compare_exchange_int (
2268- & tstate -> state , & state , _Py_THREAD_ATTACHED ))
2269- {
2283+ if (tstate_try_attach_detached (tstate , & state )) {
22702284 return ;
22712285 }
22722286 }
@@ -2534,9 +2548,12 @@ start_the_world(struct _stoptheworld_state *stw)
25342548 do {
25352549 assert (state == _Py_THREAD_SUSPENDED ||
25362550 state == _Py_THREAD_SUSPENDED_WAITING );
2537- next_state = (state == _Py_THREAD_SUSPENDED_WAITING
2538- ? _Py_THREAD_DETACHED_WAITING
2539- : _Py_THREAD_DETACHED );
2551+ if (state == _Py_THREAD_SUSPENDED_WAITING ) {
2552+ next_state = _Py_THREAD_DETACHED_WAITING ;
2553+ }
2554+ else {
2555+ next_state = _Py_THREAD_DETACHED ;
2556+ }
25402557 // Retry if an attach waiter registered concurrently.
25412558 } while (!_Py_atomic_compare_exchange_int (
25422559 & t -> state , & state , next_state ));
0 commit comments