-
-
Notifications
You must be signed in to change notification settings - Fork 679
Description
Once you know about python's trashcan that is used in its dealloc methods and that cython does not make use of it, it's not hard to cause a crash in deallocation of a cython class:
cython("""
cdef class A(object):
cdef object ref
def __init__(self,ref):
self.ref = ref
""")
A long linked list of these will quickly exhaust the C-stack (set a ulimit on the stack if you have a lot of memory):
print "allocating a"
a=A(None)
for i in range(10**6):
a=A(a)
print "deleting a"
del a
print "done deleting a"
Once you interleave with a python container type (tuple, for instance), the trashcan starts to kick in. The following runs without problem.
b=A(None)
print "allocating b"
for i in range(10**6):
b=A((b,))
print "deleting b"
del b
print "done deleting b"
This issue came up as a side issue on #13896. The trashcan is a rather complicated thing to get working right. In particular, cython must take precautions to ensure that once deallocation is started on an object, it isn't put into the trashcan in deallocs of base types.
This is now upstream http://trac.cython.org/cython_trac/ticket/797
Upstream: Reported upstream. Developers acknowledge bug.
CC: @simon-king-jena
Component: memleak
Issue created by migration from https://trac.sagemath.org/ticket/13901