@@ -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 ;
@@ -236,11 +236,13 @@ trip_signal(int sig_num)
236
236
int fd ;
237
237
Py_ssize_t rc ;
238
238
239
- Handlers [sig_num ].tripped = 1 ;
239
+ _Py_atomic_store_relaxed ( & Handlers [sig_num ].tripped , 1 ) ;
240
240
241
241
/* Set is_tripped after setting .tripped, as it gets
242
242
cleared in PyErr_CheckSignals() before .tripped. */
243
- is_tripped = 1 ;
243
+ _Py_atomic_store (& is_tripped , 1 );
244
+
245
+ /* Notify ceval.c */
244
246
_PyEval_SignalReceived ();
245
247
246
248
/* And then write to the wakeup fd *after* setting all the globals and
@@ -461,7 +463,7 @@ signal_signal_impl(PyObject *module, int signalnum, PyObject *handler)
461
463
return NULL ;
462
464
}
463
465
old_handler = Handlers [signalnum ].func ;
464
- Handlers [signalnum ].tripped = 0 ;
466
+ _Py_atomic_store_relaxed ( & Handlers [signalnum ].tripped , 0 ) ;
465
467
Py_INCREF (handler );
466
468
Handlers [signalnum ].func = handler ;
467
469
if (old_handler != NULL )
@@ -1265,11 +1267,11 @@ PyInit__signal(void)
1265
1267
goto finally ;
1266
1268
Py_INCREF (IntHandler );
1267
1269
1268
- Handlers [0 ].tripped = 0 ;
1270
+ _Py_atomic_store_relaxed ( & Handlers [0 ].tripped , 0 ) ;
1269
1271
for (i = 1 ; i < NSIG ; i ++ ) {
1270
1272
void (* t )(int );
1271
1273
t = PyOS_getsig (i );
1272
- Handlers [i ].tripped = 0 ;
1274
+ _Py_atomic_store_relaxed ( & Handlers [i ].tripped , 0 ) ;
1273
1275
if (t == SIG_DFL )
1274
1276
Handlers [i ].func = DefaultHandler ;
1275
1277
else if (t == SIG_IGN )
@@ -1493,7 +1495,7 @@ finisignal(void)
1493
1495
1494
1496
for (i = 1 ; i < NSIG ; i ++ ) {
1495
1497
func = Handlers [i ].func ;
1496
- Handlers [i ].tripped = 0 ;
1498
+ _Py_atomic_store_relaxed ( & Handlers [i ].tripped , 0 ) ;
1497
1499
Handlers [i ].func = NULL ;
1498
1500
if (i != SIGINT && func != NULL && func != Py_None &&
1499
1501
func != DefaultHandler && func != IgnoreHandler )
@@ -1514,7 +1516,7 @@ PyErr_CheckSignals(void)
1514
1516
int i ;
1515
1517
PyObject * f ;
1516
1518
1517
- if (!is_tripped )
1519
+ if (!_Py_atomic_load ( & is_tripped ) )
1518
1520
return 0 ;
1519
1521
1520
1522
#ifdef WITH_THREAD
@@ -1536,24 +1538,24 @@ PyErr_CheckSignals(void)
1536
1538
* we receive a signal i after we zero is_tripped and before we
1537
1539
* check Handlers[i].tripped.
1538
1540
*/
1539
- is_tripped = 0 ;
1541
+ _Py_atomic_store ( & is_tripped , 0 ) ;
1540
1542
1541
1543
if (!(f = (PyObject * )PyEval_GetFrame ()))
1542
1544
f = Py_None ;
1543
1545
1544
1546
for (i = 1 ; i < NSIG ; i ++ ) {
1545
- if (Handlers [i ].tripped ) {
1547
+ if (_Py_atomic_load_relaxed ( & Handlers [i ].tripped ) ) {
1546
1548
PyObject * result = NULL ;
1547
1549
PyObject * arglist = Py_BuildValue ("(iO)" , i , f );
1548
- Handlers [i ].tripped = 0 ;
1550
+ _Py_atomic_store_relaxed ( & Handlers [i ].tripped , 0 ) ;
1549
1551
1550
1552
if (arglist ) {
1551
1553
result = PyEval_CallObject (Handlers [i ].func ,
1552
1554
arglist );
1553
1555
Py_DECREF (arglist );
1554
1556
}
1555
1557
if (!result ) {
1556
- is_tripped = 1 ;
1558
+ _Py_atomic_store ( & is_tripped , 1 ) ;
1557
1559
return -1 ;
1558
1560
}
1559
1561
@@ -1592,12 +1594,12 @@ PyOS_FiniInterrupts(void)
1592
1594
int
1593
1595
PyOS_InterruptOccurred (void )
1594
1596
{
1595
- if (Handlers [SIGINT ].tripped ) {
1597
+ if (_Py_atomic_load_relaxed ( & Handlers [SIGINT ].tripped ) ) {
1596
1598
#ifdef WITH_THREAD
1597
1599
if (PyThread_get_thread_ident () != main_thread )
1598
1600
return 0 ;
1599
1601
#endif
1600
- Handlers [SIGINT ].tripped = 0 ;
1602
+ _Py_atomic_store_relaxed ( & Handlers [SIGINT ].tripped , 0 ) ;
1601
1603
return 1 ;
1602
1604
}
1603
1605
return 0 ;
@@ -1607,11 +1609,11 @@ static void
1607
1609
_clear_pending_signals (void )
1608
1610
{
1609
1611
int i ;
1610
- if (!is_tripped )
1612
+ if (!_Py_atomic_load ( & is_tripped ) )
1611
1613
return ;
1612
- is_tripped = 0 ;
1614
+ _Py_atomic_store ( & is_tripped , 0 ) ;
1613
1615
for (i = 1 ; i < NSIG ; ++ i ) {
1614
- Handlers [i ].tripped = 0 ;
1616
+ _Py_atomic_store_relaxed ( & Handlers [i ].tripped , 0 ) ;
1615
1617
}
1616
1618
}
1617
1619
0 commit comments