aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Lib/asyncio/windows_events.py
diff options
context:
space:
mode:
authorRussell Keith-Magee <russell@keith-magee.com>2023-10-13 16:12:32 +0200
committerGitHub <noreply@github.com>2023-10-13 14:12:32 +0000
commita7e2a10a85bb597d3bb8f9303214bd0524fa54c3 (patch)
tree9767640a38dfaa2e297492a45ab13030830443bd /Lib/asyncio/windows_events.py
parent0ed2329a1627fc8ae97b009114cd960c25567f75 (diff)
downloadcpython-a7e2a10a85bb597d3bb8f9303214bd0524fa54c3.tar.gz
cpython-a7e2a10a85bb597d3bb8f9303214bd0524fa54c3.zip
gh-110771: Decompose run_forever() into parts (#110773)
Effectively introduce an unstable, private (really: protected) API for subclasses that want to override `run_forever()`.
Diffstat (limited to 'Lib/asyncio/windows_events.py')
-rw-r--r--Lib/asyncio/windows_events.py37
1 files changed, 19 insertions, 18 deletions
diff --git a/Lib/asyncio/windows_events.py b/Lib/asyncio/windows_events.py
index 4a4c4bea894..b62ea75fee3 100644
--- a/Lib/asyncio/windows_events.py
+++ b/Lib/asyncio/windows_events.py
@@ -314,24 +314,25 @@ class ProactorEventLoop(proactor_events.BaseProactorEventLoop):
proactor = IocpProactor()
super().__init__(proactor)
- def run_forever(self):
- try:
- assert self._self_reading_future is None
- self.call_soon(self._loop_self_reading)
- super().run_forever()
- finally:
- if self._self_reading_future is not None:
- ov = self._self_reading_future._ov
- self._self_reading_future.cancel()
- # self_reading_future was just cancelled so if it hasn't been
- # finished yet, it never will be (it's possible that it has
- # already finished and its callback is waiting in the queue,
- # where it could still happen if the event loop is restarted).
- # Unregister it otherwise IocpProactor.close will wait for it
- # forever
- if ov is not None:
- self._proactor._unregister(ov)
- self._self_reading_future = None
+ def _run_forever_setup(self):
+ assert self._self_reading_future is None
+ self.call_soon(self._loop_self_reading)
+ super()._run_forever_setup()
+
+ def _run_forever_cleanup(self):
+ super()._run_forever_cleanup()
+ if self._self_reading_future is not None:
+ ov = self._self_reading_future._ov
+ self._self_reading_future.cancel()
+ # self_reading_future was just cancelled so if it hasn't been
+ # finished yet, it never will be (it's possible that it has
+ # already finished and its callback is waiting in the queue,
+ # where it could still happen if the event loop is restarted).
+ # Unregister it otherwise IocpProactor.close will wait for it
+ # forever
+ if ov is not None:
+ self._proactor._unregister(ov)
+ self._self_reading_future = None
async def create_pipe_connection(self, protocol_factory, address):
f = self._proactor.connect_pipe(address)