@@ -50,6 +50,7 @@ class AsyncEngine:
|
50 | 50 | "_cleanup_timer", |
51 | 51 | "_listen_socket", |
52 | 52 | "_respond_sockets", |
| 53 | +"_setup_task", |
53 | 54 | "loop", |
54 | 55 | "protocols", |
55 | 56 | "readers", |
@@ -73,6 +74,7 @@ def __init__(
|
73 | 74 | self._listen_socket = listen_socket |
74 | 75 | self._respond_sockets = respond_sockets |
75 | 76 | self._cleanup_timer: asyncio.TimerHandle | None = None |
| 77 | +self._setup_task: asyncio.Task[None] | None = None |
76 | 78 | |
77 | 79 | def setup( |
78 | 80 | self, |
@@ -82,14 +84,15 @@ def setup(
|
82 | 84 | """Set up the instance.""" |
83 | 85 | self.loop = loop |
84 | 86 | self.running_future = loop.create_future() |
85 | | -self.loop.create_task(self._async_setup(loop_thread_ready)) |
| 87 | +self._setup_task = self.loop.create_task(self._async_setup(loop_thread_ready)) |
86 | 88 | |
87 | 89 | async def _async_setup(self, loop_thread_ready: threading.Event | None) -> None: |
88 | 90 | """Set up the instance.""" |
89 | 91 | self._async_schedule_next_cache_cleanup() |
90 | 92 | await self._async_create_endpoints() |
91 | 93 | assert self.running_future is not None |
92 | | -self.running_future.set_result(True) |
| 94 | +if not self.running_future.done(): |
| 95 | +self.running_future.set_result(True) |
93 | 96 | if loop_thread_ready: |
94 | 97 | loop_thread_ready.set() |
95 | 98 | |
@@ -135,6 +138,8 @@ def _async_schedule_next_cache_cleanup(self) -> None:
|
135 | 138 | |
136 | 139 | async def _async_close(self) -> None: |
137 | 140 | """Cancel and wait for the cleanup task to finish.""" |
| 141 | +assert self._setup_task is not None |
| 142 | +await self._setup_task |
138 | 143 | self._async_shutdown() |
139 | 144 | await asyncio.sleep(0) # flush out any call soons |
140 | 145 | assert self._cleanup_timer is not None |
|