@@ -1217,31 +1217,43 @@ set_union_impl(PySetObject *so, PyObject *args)
1217
1217
static PyObject *
1218
1218
set_or (PySetObject * so , PyObject * other )
1219
1219
{
1220
- PySetObject * result ;
1220
+ PySetObject * result = NULL ;
1221
1221
1222
1222
if (!PyAnySet_Check (so ) || !PyAnySet_Check (other ))
1223
1223
Py_RETURN_NOTIMPLEMENTED ;
1224
1224
1225
+ Py_BEGIN_CRITICAL_SECTION2 (so , other );
1225
1226
result = (PySetObject * )set_copy (so , NULL );
1226
- if (result == NULL )
1227
- return NULL ;
1228
- if ((PyObject * )so == other )
1229
- return (PyObject * )result ;
1227
+ if (result == NULL ) {
1228
+ goto done ;
1229
+ }
1230
+ if ((PyObject * )so == other ) {
1231
+ goto done ;
1232
+ }
1230
1233
if (set_update_internal (result , other )) {
1231
1234
Py_DECREF (result );
1232
- return NULL ;
1235
+ result = NULL ;
1233
1236
}
1237
+ done :
1238
+ Py_END_CRITICAL_SECTION2 ();
1234
1239
return (PyObject * )result ;
1235
1240
}
1236
1241
1237
1242
static PyObject *
1238
1243
set_ior (PySetObject * so , PyObject * other )
1239
1244
{
1245
+ int rv ;
1246
+
1240
1247
if (!PyAnySet_Check (other ))
1241
1248
Py_RETURN_NOTIMPLEMENTED ;
1242
1249
1243
- if (set_update_internal (so , other ))
1250
+ Py_BEGIN_CRITICAL_SECTION2 (so , other );
1251
+ rv = set_update_internal (so , other );
1252
+ Py_END_CRITICAL_SECTION2 ();
1253
+
1254
+ if (rv ) {
1244
1255
return NULL ;
1256
+ }
1245
1257
return Py_NewRef (so );
1246
1258
}
1247
1259
@@ -1398,9 +1410,16 @@ set_intersection_update_multi_impl(PySetObject *so, PyObject *args)
1398
1410
static PyObject *
1399
1411
set_and (PySetObject * so , PyObject * other )
1400
1412
{
1413
+ PyObject * rv ;
1414
+
1401
1415
if (!PyAnySet_Check (so ) || !PyAnySet_Check (other ))
1402
1416
Py_RETURN_NOTIMPLEMENTED ;
1403
- return set_intersection (so , other );
1417
+
1418
+ Py_BEGIN_CRITICAL_SECTION2 (so , other );
1419
+ rv = set_intersection (so , other );
1420
+ Py_END_CRITICAL_SECTION2 ();
1421
+
1422
+ return rv ;
1404
1423
}
1405
1424
1406
1425
static PyObject *
@@ -1410,7 +1429,11 @@ set_iand(PySetObject *so, PyObject *other)
1410
1429
1411
1430
if (!PyAnySet_Check (other ))
1412
1431
Py_RETURN_NOTIMPLEMENTED ;
1432
+
1433
+ Py_BEGIN_CRITICAL_SECTION2 (so , other );
1413
1434
result = set_intersection_update (so , other );
1435
+ Py_END_CRITICAL_SECTION2 ();
1436
+
1414
1437
if (result == NULL )
1415
1438
return NULL ;
1416
1439
Py_DECREF (result );
@@ -1695,18 +1718,33 @@ set_difference_multi_impl(PySetObject *so, PyObject *args)
1695
1718
static PyObject *
1696
1719
set_sub (PySetObject * so , PyObject * other )
1697
1720
{
1721
+ PyObject * rv ;
1722
+
1698
1723
if (!PyAnySet_Check (so ) || !PyAnySet_Check (other ))
1699
1724
Py_RETURN_NOTIMPLEMENTED ;
1700
- return set_difference (so , other );
1725
+
1726
+ Py_BEGIN_CRITICAL_SECTION2 (so , other );
1727
+ rv = set_difference (so , other );
1728
+ Py_END_CRITICAL_SECTION2 ();
1729
+
1730
+ return rv ;
1701
1731
}
1702
1732
1703
1733
static PyObject *
1704
1734
set_isub (PySetObject * so , PyObject * other )
1705
1735
{
1736
+ int rv ;
1737
+
1706
1738
if (!PyAnySet_Check (other ))
1707
1739
Py_RETURN_NOTIMPLEMENTED ;
1708
- if (set_difference_update_internal (so , other ))
1740
+
1741
+ Py_BEGIN_CRITICAL_SECTION2 (so , other );
1742
+ rv = set_difference_update_internal (so , other );
1743
+ Py_END_CRITICAL_SECTION2 ();
1744
+
1745
+ if (rv ) {
1709
1746
return NULL ;
1747
+ }
1710
1748
return Py_NewRef (so );
1711
1749
}
1712
1750
@@ -1834,9 +1872,16 @@ set_symmetric_difference_impl(PySetObject *so, PyObject *other)
1834
1872
static PyObject *
1835
1873
set_xor (PySetObject * so , PyObject * other )
1836
1874
{
1875
+ PyObject * rv ;
1876
+
1837
1877
if (!PyAnySet_Check (so ) || !PyAnySet_Check (other ))
1838
1878
Py_RETURN_NOTIMPLEMENTED ;
1839
- return set_symmetric_difference (so , other );
1879
+
1880
+ Py_BEGIN_CRITICAL_SECTION2 (so , other );
1881
+ rv = set_symmetric_difference (so , other );
1882
+ Py_END_CRITICAL_SECTION2 ();
1883
+
1884
+ return rv ;
1840
1885
}
1841
1886
1842
1887
static PyObject *
@@ -1846,7 +1891,11 @@ set_ixor(PySetObject *so, PyObject *other)
1846
1891
1847
1892
if (!PyAnySet_Check (other ))
1848
1893
Py_RETURN_NOTIMPLEMENTED ;
1894
+
1895
+ Py_BEGIN_CRITICAL_SECTION2 (so , other );
1849
1896
result = set_symmetric_difference_update (so , other );
1897
+ Py_END_CRITICAL_SECTION2 ();
1898
+
1850
1899
if (result == NULL )
1851
1900
return NULL ;
1852
1901
Py_DECREF (result );
0 commit comments