python-trio / trio-asyncio

a re-implementation of the asyncio mainloop on top of Trio

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Deadlock on exception in call_later callback, during sleeping

shamrin opened this issue · comments

The following deadlocks:

    @pytest.mark.trio
    async def test_raise_sleeping(self, loop):
        def raise_exc():
            raise Exception()

        async def raise_sleeping():
            loop.call_later(0.1, raise_exc)
            await asyncio.sleep(0.2)

        await trio_asyncio.aio_as_trio(raise_sleeping, loop=loop)()

It gets stuck in run_aio_future on wait_task_rescheduled after it hits abort_cb callback:

def abort_cb(raise_cancel_arg):
# Save the cancel-raising function
nonlocal raise_cancel
raise_cancel = raise_cancel_arg
# Attempt to cancel our future
future.cancel()
# Keep waiting
return trio.lowlevel.Abort.FAILED
try:
res = await trio.lowlevel.wait_task_rescheduled(abort_cb)
return res

The problem exist at least since release 0.11.0.

#88 is potential similar.

(Extracted from #103.)