@@ -1038,6 +1038,17 @@ _PyInterpreterState_DeleteExceptMain(_PyRuntimeState *runtime)
10381038}
10391039#endif
10401040
1041+ static inline void
1042+ set_main_thread (PyInterpreterState * interp , PyThreadState * tstate )
1043+ {
1044+ _Py_atomic_store_ptr_relaxed (& interp -> threads .main , tstate );
1045+ }
1046+
1047+ static inline PyThreadState *
1048+ get_main_thread (PyInterpreterState * interp )
1049+ {
1050+ return _Py_atomic_load_ptr_relaxed (& interp -> threads .main );
1051+ }
10411052
10421053int
10431054_PyInterpreterState_SetRunningMain (PyInterpreterState * interp )
@@ -1052,21 +1063,22 @@ _PyInterpreterState_SetRunningMain(PyInterpreterState *interp)
10521063 "current tstate has wrong interpreter" );
10531064 return -1 ;
10541065 }
1055- interp -> threads .main = tstate ;
1066+ set_main_thread (interp , tstate );
1067+
10561068 return 0 ;
10571069}
10581070
10591071void
10601072_PyInterpreterState_SetNotRunningMain (PyInterpreterState * interp )
10611073{
1062- assert (interp -> threads . main == current_fast_get ());
1063- interp -> threads . main = NULL ;
1074+ assert (get_main_thread ( interp ) == current_fast_get ());
1075+ set_main_thread ( interp , NULL ) ;
10641076}
10651077
10661078int
10671079_PyInterpreterState_IsRunningMain (PyInterpreterState * interp )
10681080{
1069- if (interp -> threads . main != NULL ) {
1081+ if (get_main_thread ( interp ) != NULL ) {
10701082 return 1 ;
10711083 }
10721084 // Embedders might not know to call _PyInterpreterState_SetRunningMain(),
@@ -1082,18 +1094,15 @@ int
10821094_PyThreadState_IsRunningMain (PyThreadState * tstate )
10831095{
10841096 PyInterpreterState * interp = tstate -> interp ;
1085- if (interp -> threads .main != NULL ) {
1086- return tstate == interp -> threads .main ;
1087- }
10881097 // See the note in _PyInterpreterState_IsRunningMain() about
10891098 // possible false negatives here for embedders.
1090- return 0 ;
1099+ return get_main_thread ( interp ) == tstate ;
10911100}
10921101
10931102int
10941103_PyInterpreterState_FailIfRunningMain (PyInterpreterState * interp )
10951104{
1096- if (interp -> threads . main != NULL ) {
1105+ if (get_main_thread ( interp ) != NULL ) {
10971106 PyErr_SetString (PyExc_InterpreterError ,
10981107 "interpreter already running" );
10991108 return -1 ;
@@ -1105,8 +1114,8 @@ void
11051114_PyInterpreterState_ReinitRunningMain (PyThreadState * tstate )
11061115{
11071116 PyInterpreterState * interp = tstate -> interp ;
1108- if (interp -> threads . main != tstate ) {
1109- interp -> threads . main = NULL ;
1117+ if (get_main_thread ( interp ) != tstate ) {
1118+ set_main_thread ( interp , NULL ) ;
11101119 }
11111120}
11121121
0 commit comments