Skip to content

Commit ba8c0cd

Browse files
fix: add critical section for grouper_next
1 parent 54fc409 commit ba8c0cd

1 file changed

Lines changed: 22 additions & 2 deletions

File tree

Modules/itertoolsmodule.c

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -529,7 +529,7 @@ groupby_step(groupbyobject *gbo)
529529
}
530530

531531
static PyObject *
532-
groupby_next(PyObject *op)
532+
groupby_next_lock_held(PyObject *op)
533533
{
534534
PyObject *grouper;
535535
groupbyobject *gbo = groupbyobject_CAST(op);
@@ -574,6 +574,16 @@ groupby_next(PyObject *op)
574574
return _PyTuple_FromPairSteal(Py_NewRef(gbo->currkey), grouper);
575575
}
576576

577+
static PyObject *
578+
groupby_next(PyObject *op)
579+
{
580+
PyObject *result;
581+
Py_BEGIN_CRITICAL_SECTION(op);
582+
result = groupby_next_lock_held(op);
583+
Py_END_CRITICAL_SECTION()
584+
return result;
585+
}
586+
577587
static PyType_Slot groupby_slots[] = {
578588
{Py_tp_dealloc, groupby_dealloc},
579589
{Py_tp_getattro, PyObject_GenericGetAttr},
@@ -659,7 +669,7 @@ _grouper_traverse(PyObject *op, visitproc visit, void *arg)
659669
}
660670

661671
static PyObject *
662-
_grouper_next(PyObject *op)
672+
_grouper_next_lock_held(PyObject *op)
663673
{
664674
_grouperobject *igo = _grouperobject_CAST(op);
665675
groupbyobject *gbo = groupbyobject_CAST(igo->parent);
@@ -695,6 +705,16 @@ _grouper_next(PyObject *op)
695705
return r;
696706
}
697707

708+
static PyObject *
709+
_grouper_next(PyObject *op)
710+
{
711+
PyObject *result;
712+
Py_BEGIN_CRITICAL_SECTION(_grouperobject_CAST(op)->parent);
713+
result = _grouper_next_lock_held(op);
714+
Py_END_CRITICAL_SECTION()
715+
return result;
716+
}
717+
698718
static PyType_Slot _grouper_slots[] = {
699719
{Py_tp_dealloc, _grouper_dealloc},
700720
{Py_tp_getattro, PyObject_GenericGetAttr},

0 commit comments

Comments
 (0)