4
4
/* XXX Signals should be recorded per thread, now we have thread state. */
5
5
6
6
#include "Python.h"
7
- #include "pycore_atomic.h" // _Py_atomic_int
8
7
#include "pycore_call.h" // _PyObject_Call()
9
8
#include "pycore_ceval.h" // _PyEval_SignalReceived()
10
9
#include "pycore_emscripten_signal.h" // _Py_CHECK_EMSCRIPTEN_SIGNALS
@@ -124,13 +123,15 @@ typedef struct {
124
123
Py_LOCAL_INLINE (PyObject * )
125
124
get_handler (int i )
126
125
{
127
- return (PyObject * )_Py_atomic_load (& Handlers [i ].func );
126
+ return (PyObject * )_Py_atomic_load_ptr (& Handlers [i ].func );
128
127
}
129
128
130
129
Py_LOCAL_INLINE (void )
131
130
set_handler (int i , PyObject * func )
132
131
{
133
- _Py_atomic_store (& Handlers [i ].func , (uintptr_t )func );
132
+ /* Store func with atomic operation to ensure
133
+ that PyErr_SetInterrupt is async-signal-safe. */
134
+ _Py_atomic_store_ptr (& Handlers [i ].func , func );
134
135
}
135
136
136
137
@@ -267,11 +268,11 @@ report_wakeup_send_error(void* data)
267
268
static void
268
269
trip_signal (int sig_num )
269
270
{
270
- _Py_atomic_store_relaxed (& Handlers [sig_num ].tripped , 1 );
271
+ _Py_atomic_store_int (& Handlers [sig_num ].tripped , 1 );
271
272
272
273
/* Set is_tripped after setting .tripped, as it gets
273
274
cleared in PyErr_CheckSignals() before .tripped. */
274
- _Py_atomic_store (& is_tripped , 1 );
275
+ _Py_atomic_store_int (& is_tripped , 1 );
275
276
276
277
/* Signals are always handled by the main interpreter */
277
278
PyInterpreterState * interp = _PyInterpreterState_Main ();
@@ -1731,7 +1732,7 @@ _PySignal_Fini(void)
1731
1732
// Restore default signals and clear handlers
1732
1733
for (int signum = 1 ; signum < Py_NSIG ; signum ++ ) {
1733
1734
PyObject * func = get_handler (signum );
1734
- _Py_atomic_store_relaxed (& Handlers [signum ].tripped , 0 );
1735
+ _Py_atomic_store_int_relaxed (& Handlers [signum ].tripped , 0 );
1735
1736
set_handler (signum , NULL );
1736
1737
if (func != NULL
1737
1738
&& func != Py_None
@@ -1785,7 +1786,7 @@ int
1785
1786
_PyErr_CheckSignalsTstate (PyThreadState * tstate )
1786
1787
{
1787
1788
_Py_CHECK_EMSCRIPTEN_SIGNALS ();
1788
- if (!_Py_atomic_load (& is_tripped )) {
1789
+ if (!_Py_atomic_load_int (& is_tripped )) {
1789
1790
return 0 ;
1790
1791
}
1791
1792
@@ -1803,15 +1804,15 @@ _PyErr_CheckSignalsTstate(PyThreadState *tstate)
1803
1804
* we receive a signal i after we zero is_tripped and before we
1804
1805
* check Handlers[i].tripped.
1805
1806
*/
1806
- _Py_atomic_store (& is_tripped , 0 );
1807
+ _Py_atomic_store_int (& is_tripped , 0 );
1807
1808
1808
1809
_PyInterpreterFrame * frame = _PyThreadState_GetFrame (tstate );
1809
1810
signal_state_t * state = & signal_global_state ;
1810
1811
for (int i = 1 ; i < Py_NSIG ; i ++ ) {
1811
- if (!_Py_atomic_load_relaxed (& Handlers [i ].tripped )) {
1812
+ if (!_Py_atomic_load_int_relaxed (& Handlers [i ].tripped )) {
1812
1813
continue ;
1813
1814
}
1814
- _Py_atomic_store_relaxed (& Handlers [i ].tripped , 0 );
1815
+ _Py_atomic_store_int_relaxed (& Handlers [i ].tripped , 0 );
1815
1816
1816
1817
/* Signal handlers can be modified while a signal is received,
1817
1818
* and therefore the fact that trip_signal() or PyErr_SetInterrupt()
@@ -1857,7 +1858,7 @@ _PyErr_CheckSignalsTstate(PyThreadState *tstate)
1857
1858
}
1858
1859
if (!result ) {
1859
1860
/* On error, re-schedule a call to _PyErr_CheckSignalsTstate() */
1860
- _Py_atomic_store (& is_tripped , 1 );
1861
+ _Py_atomic_store_int (& is_tripped , 1 );
1861
1862
return -1 ;
1862
1863
}
1863
1864
@@ -1975,7 +1976,7 @@ _PySignal_Init(int install_signal_handlers)
1975
1976
#endif
1976
1977
1977
1978
for (int signum = 1 ; signum < Py_NSIG ; signum ++ ) {
1978
- _Py_atomic_store_relaxed (& Handlers [signum ].tripped , 0 );
1979
+ _Py_atomic_store_int_relaxed (& Handlers [signum ].tripped , 0 );
1979
1980
}
1980
1981
1981
1982
if (install_signal_handlers ) {
@@ -1997,11 +1998,11 @@ _PyOS_InterruptOccurred(PyThreadState *tstate)
1997
1998
return 0 ;
1998
1999
}
1999
2000
2000
- if (!_Py_atomic_load_relaxed (& Handlers [SIGINT ].tripped )) {
2001
+ if (!_Py_atomic_load_int_relaxed (& Handlers [SIGINT ].tripped )) {
2001
2002
return 0 ;
2002
2003
}
2003
2004
2004
- _Py_atomic_store_relaxed (& Handlers [SIGINT ].tripped , 0 );
2005
+ _Py_atomic_store_int_relaxed (& Handlers [SIGINT ].tripped , 0 );
2005
2006
return 1 ;
2006
2007
}
2007
2008
@@ -2019,13 +2020,13 @@ PyOS_InterruptOccurred(void)
2019
2020
static void
2020
2021
_clear_pending_signals (void )
2021
2022
{
2022
- if (!_Py_atomic_load (& is_tripped )) {
2023
+ if (!_Py_atomic_load_int (& is_tripped )) {
2023
2024
return ;
2024
2025
}
2025
2026
2026
- _Py_atomic_store (& is_tripped , 0 );
2027
+ _Py_atomic_store_int (& is_tripped , 0 );
2027
2028
for (int i = 1 ; i < Py_NSIG ; ++ i ) {
2028
- _Py_atomic_store_relaxed (& Handlers [i ].tripped , 0 );
2029
+ _Py_atomic_store_int_relaxed (& Handlers [i ].tripped , 0 );
2029
2030
}
2030
2031
}
2031
2032
0 commit comments