2011/11/14 Vitja Makarov <vitja.maka...@gmail.com>: > 2011/11/13 Matt Hagy <h...@gatech.edu>: >> Hi, >> >> Cython generators aren’t closed on dealloc and this can lead to cleanup code >> not being ran (see example below). I couldn’t find any reference to this >> issue on the trac or the wiki and therefore wanted to report it. If this is >> a know issue please disregard this post. >> > > Good catch! > >> >> I believe this can easily be corrected by adding the following line to the >> top of each generator dealloc function: >> >> if (p->resume_label != -1) __Pyx_Generator_Close(o); >> > > I think that correct fix should be > 0 as we don't wanna close just > started generator > i >> This explicitly closes the generator unless it’s already finished. For >> testing I manually added this code to the generated C file and it worked as >> expected. >> >> -Matt >> > > It's not that easy to fix. For convenience Closure sublasses generator type: > > def foo(a): > try: > yield a > finally: > print 'cleanup' > print '"a" might be dead at this point', a > > The problem is closure's __dealloc__ is called first then generator's. > So we can't call Geneator_Close() with deallocated closure. > > I see few options here: > - do cleanup in closure type itsef > - make closure generator's attribute > > I like the second case. >
I've fixed it here https://github.com/vitek/cython/commits/_generators_cleanup I've taken deallocation code from CPython it performs magic object resurrection when it''s almost dead. Now I'm waiting for hudson job then I'll create a pull request. -- vitja. _______________________________________________ cython-devel mailing list cython-devel@python.org http://mail.python.org/mailman/listinfo/cython-devel