@@ -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 }
@@ -2555,9 +2569,12 @@ start_the_world(struct _stoptheworld_state *stw)
25552569 do {
25562570 assert (state == _Py_THREAD_SUSPENDED ||
25572571 state == _Py_THREAD_SUSPENDED_WAITING );
2558- next_state = (state == _Py_THREAD_SUSPENDED_WAITING
2559- ? _Py_THREAD_DETACHED_WAITING
2560- : _Py_THREAD_DETACHED );
2572+ if (state == _Py_THREAD_SUSPENDED_WAITING ) {
2573+ next_state = _Py_THREAD_DETACHED_WAITING ;
2574+ }
2575+ else {
2576+ next_state = _Py_THREAD_DETACHED ;
2577+ }
25612578 // Retry if an attach waiter registered concurrently.
25622579 } while (!_Py_atomic_compare_exchange_int (
25632580 & t -> state , & state , next_state ));
0 commit comments