diff --git a/tests/test_base.py b/tests/test_base.py index 96bb3eea..3e58f8ad 100644 --- a/tests/test_base.py +++ b/tests/test_base.py @@ -295,6 +295,20 @@ async def foo(): with self.assertRaisesRegex(ValueError, 'aaa'): self.loop.run_until_complete(foo()) + def test_run_until_complete_loop_orphan_future_close_loop(self): + async def foo(sec=0): + await asyncio.sleep(sec) + self.loop.close() + loop = asyncio.new_event_loop() + asyncio.set_event_loop(loop) + try: + with mock.patch('asyncio.base_events.BaseEventLoop.run_forever', side_effect=Exception): + loop.run_until_complete(foo()) + except: + pass + loop.run_until_complete(foo(0.1)) + loop.close() + def test_debug_slow_callbacks(self): logger = logging.getLogger('asyncio') self.loop.set_debug(True) diff --git a/uvloop/loop.pyx b/uvloop/loop.pyx index 256ef53f..2c88b253 100644 --- a/uvloop/loop.pyx +++ b/uvloop/loop.pyx @@ -1196,7 +1196,8 @@ cdef class Loop: # local task. future.exception() raise - future.remove_done_callback(done_cb) + finally: + future.remove_done_callback(done_cb) if not future.done(): raise RuntimeError('Event loop stopped before Future completed.')