@@ -979,7 +979,11 @@ set_update_impl(PySetObject *so, PyObject *args)
979
979
980
980
for (i = 0 ; i < PyTuple_GET_SIZE (args ) ; i ++ ) {
981
981
PyObject * other = PyTuple_GET_ITEM (args , i );
982
- if (set_update_internal (so , other ))
982
+ int rv ;
983
+ Py_BEGIN_CRITICAL_SECTION2 (so , other );
984
+ rv = set_update_internal (so , other );
985
+ Py_END_CRITICAL_SECTION2 ();
986
+ if (rv )
983
987
return NULL ;
984
988
}
985
989
Py_RETURN_NONE ;
@@ -1198,15 +1202,21 @@ set_union_impl(PySetObject *so, PyObject *args)
1198
1202
PyObject * other ;
1199
1203
Py_ssize_t i ;
1200
1204
1205
+ Py_BEGIN_CRITICAL_SECTION (so );
1201
1206
result = (PySetObject * )set_copy (so , NULL );
1207
+ Py_END_CRITICAL_SECTION ();
1202
1208
if (result == NULL )
1203
1209
return NULL ;
1204
1210
1205
1211
for (i = 0 ; i < PyTuple_GET_SIZE (args ) ; i ++ ) {
1212
+ int rv ;
1206
1213
other = PyTuple_GET_ITEM (args , i );
1207
1214
if ((PyObject * )so == other )
1208
1215
continue ;
1209
- if (set_update_internal (result , other )) {
1216
+ Py_BEGIN_CRITICAL_SECTION (other );
1217
+ rv = set_update_internal (result , other );
1218
+ Py_END_CRITICAL_SECTION ();
1219
+ if (rv ) {
1210
1220
Py_DECREF (result );
1211
1221
return NULL ;
1212
1222
}
@@ -1355,13 +1365,21 @@ set_intersection_multi_impl(PySetObject *so, PyObject *args)
1355
1365
{
1356
1366
Py_ssize_t i ;
1357
1367
1358
- if (PyTuple_GET_SIZE (args ) == 0 )
1359
- return set_copy (so , NULL );
1368
+ if (PyTuple_GET_SIZE (args ) == 0 ) {
1369
+ PyObject * result ;
1370
+ Py_BEGIN_CRITICAL_SECTION (so );
1371
+ result = set_copy (so , NULL );
1372
+ Py_END_CRITICAL_SECTION ();
1373
+ return result ;
1374
+ }
1360
1375
1361
1376
PyObject * result = Py_NewRef (so );
1362
1377
for (i = 0 ; i < PyTuple_GET_SIZE (args ) ; i ++ ) {
1363
1378
PyObject * other = PyTuple_GET_ITEM (args , i );
1364
- PyObject * newresult = set_intersection ((PySetObject * )result , other );
1379
+ PyObject * newresult ;
1380
+ Py_BEGIN_CRITICAL_SECTION2 (result , other );
1381
+ newresult = set_intersection ((PySetObject * )result , other );
1382
+ Py_END_CRITICAL_SECTION2 ();
1365
1383
if (newresult == NULL ) {
1366
1384
Py_DECREF (result );
1367
1385
return NULL ;
@@ -1402,7 +1420,9 @@ set_intersection_update_multi_impl(PySetObject *so, PyObject *args)
1402
1420
tmp = set_intersection_multi_impl (so , args );
1403
1421
if (tmp == NULL )
1404
1422
return NULL ;
1423
+ Py_BEGIN_CRITICAL_SECTION (so );
1405
1424
set_swap_bodies (so , (PySetObject * )tmp );
1425
+ Py_END_CRITICAL_SECTION ();
1406
1426
Py_DECREF (tmp );
1407
1427
Py_RETURN_NONE ;
1408
1428
}
@@ -1585,8 +1605,13 @@ set_difference_update_impl(PySetObject *so, PyObject *args)
1585
1605
1586
1606
for (i = 0 ; i < PyTuple_GET_SIZE (args ) ; i ++ ) {
1587
1607
PyObject * other = PyTuple_GET_ITEM (args , i );
1588
- if (set_difference_update_internal (so , other ))
1608
+ int rv ;
1609
+ Py_BEGIN_CRITICAL_SECTION2 (so , other );
1610
+ rv = set_difference_update_internal (so , other );
1611
+ Py_END_CRITICAL_SECTION2 ();
1612
+ if (rv ) {
1589
1613
return NULL ;
1614
+ }
1590
1615
}
1591
1616
Py_RETURN_NONE ;
1592
1617
}
@@ -1697,17 +1722,27 @@ set_difference_multi_impl(PySetObject *so, PyObject *args)
1697
1722
Py_ssize_t i ;
1698
1723
PyObject * result , * other ;
1699
1724
1700
- if (PyTuple_GET_SIZE (args ) == 0 )
1701
- return set_copy (so , NULL );
1725
+ if (PyTuple_GET_SIZE (args ) == 0 ) {
1726
+ Py_BEGIN_CRITICAL_SECTION (so );
1727
+ result = set_copy (so , NULL );
1728
+ Py_END_CRITICAL_SECTION ();
1729
+ return result ;
1730
+ }
1702
1731
1703
1732
other = PyTuple_GET_ITEM (args , 0 );
1733
+ Py_BEGIN_CRITICAL_SECTION2 (so , other );
1704
1734
result = set_difference (so , other );
1735
+ Py_END_CRITICAL_SECTION2 ();
1705
1736
if (result == NULL )
1706
1737
return NULL ;
1707
1738
1708
1739
for (i = 1 ; i < PyTuple_GET_SIZE (args ) ; i ++ ) {
1709
1740
other = PyTuple_GET_ITEM (args , i );
1710
- if (set_difference_update_internal ((PySetObject * )result , other )) {
1741
+ int rv ;
1742
+ Py_BEGIN_CRITICAL_SECTION (other );
1743
+ rv = set_difference_update_internal ((PySetObject * )result , other );
1744
+ Py_END_CRITICAL_SECTION ();
1745
+ if (rv ) {
1711
1746
Py_DECREF (result );
1712
1747
return NULL ;
1713
1748
}
0 commit comments