@@ -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 )
@@ -1269,11 +1271,11 @@ PyInit__signal(void)
1269
1271
goto finally ;
1270
1272
Py_INCREF (IntHandler );
1271
1273
1272
- Handlers [0 ].tripped = 0 ;
1274
+ _Py_atomic_store_relaxed ( & Handlers [0 ].tripped , 0 ) ;
1273
1275
for (i = 1 ; i < NSIG ; i ++ ) {
1274
1276
void (* t )(int );
1275
1277
t = PyOS_getsig (i );
1276
- Handlers [i ].tripped = 0 ;
1278
+ _Py_atomic_store_relaxed ( & Handlers [i ].tripped , 0 ) ;
1277
1279
if (t == SIG_DFL )
1278
1280
Handlers [i ].func = DefaultHandler ;
1279
1281
else if (t == SIG_IGN )
@@ -1497,7 +1499,7 @@ finisignal(void)
1497
1499
1498
1500
for (i = 1 ; i < NSIG ; i ++ ) {
1499
1501
func = Handlers [i ].func ;
1500
- Handlers [i ].tripped = 0 ;
1502
+ _Py_atomic_store_relaxed ( & Handlers [i ].tripped , 0 ) ;
1501
1503
Handlers [i ].func = NULL ;
1502
1504
if (i != SIGINT && func != NULL && func != Py_None &&
1503
1505
func != DefaultHandler && func != IgnoreHandler )
@@ -1518,7 +1520,7 @@ PyErr_CheckSignals(void)
1518
1520
int i ;
1519
1521
PyObject * f ;
1520
1522
1521
- if (!is_tripped )
1523
+ if (!_Py_atomic_load ( & is_tripped ) )
1522
1524
return 0 ;
1523
1525
1524
1526
#ifdef WITH_THREAD
@@ -1540,24 +1542,24 @@ PyErr_CheckSignals(void)
1540
1542
* we receive a signal i after we zero is_tripped and before we
1541
1543
* check Handlers[i].tripped.
1542
1544
*/
1543
- is_tripped = 0 ;
1545
+ _Py_atomic_store ( & is_tripped , 0 ) ;
1544
1546
1545
1547
if (!(f = (PyObject * )PyEval_GetFrame ()))
1546
1548
f = Py_None ;
1547
1549
1548
1550
for (i = 1 ; i < NSIG ; i ++ ) {
1549
- if (Handlers [i ].tripped ) {
1551
+ if (_Py_atomic_load_relaxed ( & Handlers [i ].tripped ) ) {
1550
1552
PyObject * result = NULL ;
1551
1553
PyObject * arglist = Py_BuildValue ("(iO)" , i , f );
1552
- Handlers [i ].tripped = 0 ;
1554
+ _Py_atomic_store_relaxed ( & Handlers [i ].tripped , 0 ) ;
1553
1555
1554
1556
if (arglist ) {
1555
1557
result = PyEval_CallObject (Handlers [i ].func ,
1556
1558
arglist );
1557
1559
Py_DECREF (arglist );
1558
1560
}
1559
1561
if (!result ) {
1560
- is_tripped = 1 ;
1562
+ _Py_atomic_store ( & is_tripped , 1 ) ;
1561
1563
return -1 ;
1562
1564
}
1563
1565
@@ -1596,12 +1598,12 @@ PyOS_FiniInterrupts(void)
1596
1598
int
1597
1599
PyOS_InterruptOccurred (void )
1598
1600
{
1599
- if (Handlers [SIGINT ].tripped ) {
1601
+ if (_Py_atomic_load_relaxed ( & Handlers [SIGINT ].tripped ) ) {
1600
1602
#ifdef WITH_THREAD
1601
1603
if (PyThread_get_thread_ident () != main_thread )
1602
1604
return 0 ;
1603
1605
#endif
1604
- Handlers [SIGINT ].tripped = 0 ;
1606
+ _Py_atomic_store_relaxed ( & Handlers [SIGINT ].tripped , 0 ) ;
1605
1607
return 1 ;
1606
1608
}
1607
1609
return 0 ;
@@ -1611,11 +1613,11 @@ static void
1611
1613
_clear_pending_signals (void )
1612
1614
{
1613
1615
int i ;
1614
- if (!is_tripped )
1616
+ if (!_Py_atomic_load ( & is_tripped ) )
1615
1617
return ;
1616
- is_tripped = 0 ;
1618
+ _Py_atomic_store ( & is_tripped , 0 ) ;
1617
1619
for (i = 1 ; i < NSIG ; ++ i ) {
1618
- Handlers [i ].tripped = 0 ;
1620
+ _Py_atomic_store_relaxed ( & Handlers [i ].tripped , 0 ) ;
1619
1621
}
1620
1622
}
1621
1623
0 commit comments