@@ -93,7 +93,7 @@ static pid_t main_pid;
93
93
#endif
94
94
95
95
static volatile struct {
96
- sig_atomic_t tripped ;
96
+ _Py_atomic_int tripped ;
97
97
PyObject * func ;
98
98
} Handlers [NSIG ];
99
99
@@ -113,7 +113,7 @@ static volatile sig_atomic_t wakeup_fd = -1;
113
113
#endif
114
114
115
115
/* Speed up sigcheck() when none tripped */
116
- static volatile sig_atomic_t is_tripped = 0 ;
116
+ static _Py_atomic_int is_tripped ;
117
117
118
118
static PyObject * DefaultHandler ;
119
119
static PyObject * IgnoreHandler ;
@@ -240,11 +240,13 @@ trip_signal(int sig_num)
240
240
int fd ;
241
241
Py_ssize_t rc ;
242
242
243
- Handlers [sig_num ].tripped = 1 ;
243
+ _Py_atomic_store_relaxed ( & Handlers [sig_num ].tripped , 1 ) ;
244
244
245
245
/* Set is_tripped after setting .tripped, as it gets
246
246
cleared in PyErr_CheckSignals() before .tripped. */
247
- is_tripped = 1 ;
247
+ _Py_atomic_store (& is_tripped , 1 );
248
+
249
+ /* Notify ceval.c */
248
250
_PyEval_SignalReceived ();
249
251
250
252
/* And then write to the wakeup fd *after* setting all the globals and
@@ -465,7 +467,7 @@ signal_signal_impl(PyObject *module, int signalnum, PyObject *handler)
465
467
return NULL ;
466
468
}
467
469
old_handler = Handlers [signalnum ].func ;
468
- Handlers [signalnum ].tripped = 0 ;
470
+ _Py_atomic_store_relaxed ( & Handlers [signalnum ].tripped , 0 ) ;
469
471
Py_INCREF (handler );
470
472
Handlers [signalnum ].func = handler ;
471
473
if (old_handler != NULL )
@@ -1264,11 +1266,11 @@ PyInit__signal(void)
1264
1266
goto finally ;
1265
1267
Py_INCREF (IntHandler );
1266
1268
1267
- Handlers [0 ].tripped = 0 ;
1269
+ _Py_atomic_store_relaxed ( & Handlers [0 ].tripped , 0 ) ;
1268
1270
for (i = 1 ; i < NSIG ; i ++ ) {
1269
1271
void (* t )(int );
1270
1272
t = PyOS_getsig (i );
1271
- Handlers [i ].tripped = 0 ;
1273
+ _Py_atomic_store_relaxed ( & Handlers [i ].tripped , 0 ) ;
1272
1274
if (t == SIG_DFL )
1273
1275
Handlers [i ].func = DefaultHandler ;
1274
1276
else if (t == SIG_IGN )
@@ -1492,7 +1494,7 @@ finisignal(void)
1492
1494
1493
1495
for (i = 1 ; i < NSIG ; i ++ ) {
1494
1496
func = Handlers [i ].func ;
1495
- Handlers [i ].tripped = 0 ;
1497
+ _Py_atomic_store_relaxed ( & Handlers [i ].tripped , 0 ) ;
1496
1498
Handlers [i ].func = NULL ;
1497
1499
if (i != SIGINT && func != NULL && func != Py_None &&
1498
1500
func != DefaultHandler && func != IgnoreHandler )
@@ -1513,7 +1515,7 @@ PyErr_CheckSignals(void)
1513
1515
int i ;
1514
1516
PyObject * f ;
1515
1517
1516
- if (!is_tripped )
1518
+ if (!_Py_atomic_load ( & is_tripped ) )
1517
1519
return 0 ;
1518
1520
1519
1521
#ifdef WITH_THREAD
@@ -1535,24 +1537,24 @@ PyErr_CheckSignals(void)
1535
1537
* we receive a signal i after we zero is_tripped and before we
1536
1538
* check Handlers[i].tripped.
1537
1539
*/
1538
- is_tripped = 0 ;
1540
+ _Py_atomic_store ( & is_tripped , 0 ) ;
1539
1541
1540
1542
if (!(f = (PyObject * )PyEval_GetFrame ()))
1541
1543
f = Py_None ;
1542
1544
1543
1545
for (i = 1 ; i < NSIG ; i ++ ) {
1544
- if (Handlers [i ].tripped ) {
1546
+ if (_Py_atomic_load_relaxed ( & Handlers [i ].tripped ) ) {
1545
1547
PyObject * result = NULL ;
1546
1548
PyObject * arglist = Py_BuildValue ("(iO)" , i , f );
1547
- Handlers [i ].tripped = 0 ;
1549
+ _Py_atomic_store_relaxed ( & Handlers [i ].tripped , 0 ) ;
1548
1550
1549
1551
if (arglist ) {
1550
1552
result = PyEval_CallObject (Handlers [i ].func ,
1551
1553
arglist );
1552
1554
Py_DECREF (arglist );
1553
1555
}
1554
1556
if (!result ) {
1555
- is_tripped = 1 ;
1557
+ _Py_atomic_store ( & is_tripped , 1 ) ;
1556
1558
return -1 ;
1557
1559
}
1558
1560
@@ -1591,12 +1593,12 @@ PyOS_FiniInterrupts(void)
1591
1593
int
1592
1594
PyOS_InterruptOccurred (void )
1593
1595
{
1594
- if (Handlers [SIGINT ].tripped ) {
1596
+ if (_Py_atomic_load_relaxed ( & Handlers [SIGINT ].tripped ) ) {
1595
1597
#ifdef WITH_THREAD
1596
1598
if (PyThread_get_thread_ident () != main_thread )
1597
1599
return 0 ;
1598
1600
#endif
1599
- Handlers [SIGINT ].tripped = 0 ;
1601
+ _Py_atomic_store_relaxed ( & Handlers [SIGINT ].tripped , 0 ) ;
1600
1602
return 1 ;
1601
1603
}
1602
1604
return 0 ;
@@ -1606,11 +1608,11 @@ static void
1606
1608
_clear_pending_signals (void )
1607
1609
{
1608
1610
int i ;
1609
- if (!is_tripped )
1611
+ if (!_Py_atomic_load ( & is_tripped ) )
1610
1612
return ;
1611
- is_tripped = 0 ;
1613
+ _Py_atomic_store ( & is_tripped , 0 ) ;
1612
1614
for (i = 1 ; i < NSIG ; ++ i ) {
1613
- Handlers [i ].tripped = 0 ;
1615
+ _Py_atomic_store_relaxed ( & Handlers [i ].tripped , 0 ) ;
1614
1616
}
1615
1617
}
1616
1618
0 commit comments