On 2016-05-16 3:58 AM, Stefan Behnel wrote:
Yury Selivanov schrieb am 14.05.2016 um 23:31:
Under some circumstances, in asyncio code that runs in uvloop [1],
cython code segfaults in cython/Cython/Utility/Coroutine.c:
static PyObject *
__Pyx_Coroutine_get_qualname(__pyx_CoroutineObject *self)
{
Py_INCREF(self->gi_qualname);
return self->gi_qualname;
}
"self->gi_qualname" can be NULL. The correct code is probably:
__Pyx_Coroutine_get_qualname(__pyx_CoroutineObject *self)
{
if (self->gi_qualname == NULL) { return __pyx_empty_unicode; }
Py_INCREF(self->gi_qualname);
return self->gi_qualname;
}
I wonder why it can be NULL. It's supposed to be set to a string constant
at creation time. See GeneratorDefNode in Nodes.py. Is there anything
special you are doing with these objects? Could you try to figure out how
the ones that have a NULL value here are created?
It's probably because asyncio Future and Task have __del__ methods
which (may) try to call repr on coroutines. At that point of time,
maybe the GC breaks the refs.
Would you be able to fix the refs for qualname/name?
Yury
_______________________________________________
cython-devel mailing list
cython-devel@python.org
https://mail.python.org/mailman/listinfo/cython-devel