Reputation: 3299
I have following Python2 function in a big Python-Cython project (print statements added for debugging):
import gc
def e_closure (startstate):
"""Return all states reachable from startstates on epsilon transitions.
"""
print('eclos1', startstate)
print(len(gc.get_objects()))
sys.stdout.flush()
work = [startstate]
set()
print('eclos2')
print(len(gc.get_objects()))
sys.stdout.flush()
result = set()
print('eclos3')
sys.stdout.flush()
while work:
s = work.pop()
result.add(s)
for n in s.get_transitions(state.EPSILON):
if n not in result:
work.append(n)
x = sorted(result, key=lambda s: s.name)
return x
This is crashing with error Fatal Python error: GC object already tracked
when set()
constructor is called. That too not first invocation, but instead exactly on 10th invocation. If I add additional set()
call in previous lines, it crashes there. But it is not crashing if I add dict()
or list()
calls instead.
Sample logs:
('eclos1', start)
6961
eclos2
6962
eclos3
('eclos1', d0)
6962
eclos2
6963
eclos3
('eclos1', d2)
6963
eclos2
6964
eclos3
('eclos1', d3)
6964
eclos2
6965
eclos3
('eclos1', d4)
6965
eclos2
6966
eclos3
('eclos1', d1)
6966
eclos2
6967
eclos3
('eclos1', c0)
6967
eclos2
6968
eclos3
('eclos1', c2)
6968
eclos2
6969
eclos3
('eclos1', c3)
6969
eclos2
6970
eclos3
('eclos1', c4)
6970
In this entire function, only get_transitions
is a cython function. Also, it was working before and causing issues only after cythonization. But I'm unable to understand what is the issue and how to debug it.
Python: Python 2.7.12
Cython: Cython version 0.23.4
Upvotes: 0
Views: 25