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.

-- 
vitja.
_______________________________________________
cython-devel mailing list
cython-devel@python.org
http://mail.python.org/mailman/listinfo/cython-devel

Reply via email to