@@ -1038,6 +1038,17 @@ _PyInterpreterState_DeleteExceptMain(_PyRuntimeState *runtime)
1038
1038
}
1039
1039
#endif
1040
1040
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
+ }
1041
1052
1042
1053
int
1043
1054
_PyInterpreterState_SetRunningMain (PyInterpreterState * interp )
@@ -1052,21 +1063,22 @@ _PyInterpreterState_SetRunningMain(PyInterpreterState *interp)
1052
1063
"current tstate has wrong interpreter" );
1053
1064
return -1 ;
1054
1065
}
1055
- interp -> threads .main = tstate ;
1066
+ set_main_thread (interp , tstate );
1067
+
1056
1068
return 0 ;
1057
1069
}
1058
1070
1059
1071
void
1060
1072
_PyInterpreterState_SetNotRunningMain (PyInterpreterState * interp )
1061
1073
{
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 ) ;
1064
1076
}
1065
1077
1066
1078
int
1067
1079
_PyInterpreterState_IsRunningMain (PyInterpreterState * interp )
1068
1080
{
1069
- if (interp -> threads . main != NULL ) {
1081
+ if (get_main_thread ( interp ) != NULL ) {
1070
1082
return 1 ;
1071
1083
}
1072
1084
// Embedders might not know to call _PyInterpreterState_SetRunningMain(),
@@ -1082,18 +1094,15 @@ int
1082
1094
_PyThreadState_IsRunningMain (PyThreadState * tstate )
1083
1095
{
1084
1096
PyInterpreterState * interp = tstate -> interp ;
1085
- if (interp -> threads .main != NULL ) {
1086
- return tstate == interp -> threads .main ;
1087
- }
1088
1097
// See the note in _PyInterpreterState_IsRunningMain() about
1089
1098
// possible false negatives here for embedders.
1090
- return 0 ;
1099
+ return get_main_thread ( interp ) == tstate ;
1091
1100
}
1092
1101
1093
1102
int
1094
1103
_PyInterpreterState_FailIfRunningMain (PyInterpreterState * interp )
1095
1104
{
1096
- if (interp -> threads . main != NULL ) {
1105
+ if (get_main_thread ( interp ) != NULL ) {
1097
1106
PyErr_SetString (PyExc_InterpreterError ,
1098
1107
"interpreter already running" );
1099
1108
return -1 ;
@@ -1105,8 +1114,8 @@ void
1105
1114
_PyInterpreterState_ReinitRunningMain (PyThreadState * tstate )
1106
1115
{
1107
1116
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 ) ;
1110
1119
}
1111
1120
}
1112
1121
0 commit comments