Open graingert opened 1 week ago
this is because Cython coroutines appear to have a frame, so it doesn't get a wrapper python coroutine:
but don't actually push that frame when the coroutine runs
I think we need to check if not cr_frame.f_code.co_code:
but don't actually push that frame when the coroutine runs
Should this be raised as a Cython bug? (I know that doesn't help us in the meanwhile but having an attribute in some cases but not all is not useful)
I think we need to check
if not cr_frame.f_code.co_code:
I assume this would undo any sort of KI protection enabled by outer scopes, because it's impossible to know whether it's enabling or disabling KI protection? I think that makes sense, though maybe it would be better to detect that the frame will not be there and then create a wrapper, unless bad
gets a frame if Cython detects there's a decorator. This should presumably still block forever in Cython:
@enable_ki_protection
async def bad():
sleep()
We could have two async wrappers for cython, one protected and one unprotected, and use the KI protected-ness of the coro.cr_frame.co_code to pick which one you use
This would not work for cases like this:
@enable_ki_protection
async def bad():
sleep()
async def outer():
return await bad()
The other option is for enable_ki_protection to detect cython functions and wrap them with an extra (async, generator,asyncgenerater)function
I think detecting Cython functions and wrapping then would ultimately be simpler and that's better.
We could have two async wrappers for cython, one protected and one unprotected, and use the KI protected-ness of the coro.cr_frame.co_code to pick which one you use
I don't get what you mean by this, though I'm also tired so it could be that too.
if you write a python function:
and call it from a cython task:
it hangs forever and can't be interrupted with ctrl+c
currently_ki_protected sees the following stack: