@@ -2012,7 +2012,7 @@ dequeiter_len(PyObject *op, PyObject *Py_UNUSED(dummy))
20122012 return PyLong_FromSsize_t (remaining );
20132013}
20142014
2015- PyDoc_STRVAR (dequeiter_len_doc , "Private method returning an estimate of len(list(it))." );
2015+ PyDoc_STRVAR (length_hint_doc , "Private method returning an estimate of len(list(it))." );
20162016
20172017static PyObject *
20182018dequeiter_reduce (PyObject * op , PyObject * Py_UNUSED (dummy ))
@@ -2030,12 +2030,11 @@ dequeiter_reduce(PyObject *op, PyObject *Py_UNUSED(dummy))
20302030}
20312031
20322032static PyMethodDef dequeiter_methods [] = {
2033- {"__length_hint__" , dequeiter_len , METH_NOARGS , dequeiter_len_doc },
2033+ {"__length_hint__" , dequeiter_len , METH_NOARGS , length_hint_doc },
20342034 {"__reduce__" , dequeiter_reduce , METH_NOARGS , reduce_doc },
20352035 {NULL , NULL } /* sentinel */
20362036};
20372037
2038-
20392038static PyType_Slot dequeiter_slots [] = {
20402039 {Py_tp_dealloc , dequeiter_dealloc },
20412040 {Py_tp_getattro , PyObject_GenericGetAttr },
@@ -2102,16 +2101,17 @@ dequereviter_next_lock_held(dequeiterobject *it, dequeobject *deque)
21022101}
21032102
21042103static PyObject *
2105- dequereviter_next (PyObject * self )
2104+ dequeiter_next (PyObject * op )
21062105{
21072106 PyObject * result ;
2108- dequeiterobject * it = dequeiterobject_CAST (self );
2109- Py_BEGIN_CRITICAL_SECTION2 (it , it -> deque );
2110- result = dequereviter_next_lock_held (it , it -> deque );
2107+ dequeiterobject * it = dequeiterobject_CAST (op );
2108+ // It's safe to access it->deque without holding the per-object lock for it
2109+ // here; it->deque is only assigned during construction of it.
2110+ dequeobject * deque = it -> deque ;
2111+ Py_BEGIN_CRITICAL_SECTION2 (it , deque );
2112+ result = dequeiter_next_lock_held (it , deque );
21112113 Py_END_CRITICAL_SECTION2 ();
2112- // if (result == NULL) {
2113- // Py_DECREF(it);
2114- // }
2114+
21152115 return result ;
21162116}
21172117
0 commit comments