@@ -529,7 +529,7 @@ groupby_step(groupbyobject *gbo)
529529}
530530
531531static 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+
577587static 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
661671static 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+
698718static PyType_Slot _grouper_slots [] = {
699719 {Py_tp_dealloc , _grouper_dealloc },
700720 {Py_tp_getattro , PyObject_GenericGetAttr },
0 commit comments