diff options
| author | Russell Keith-Magee <russell@keith-magee.com> | 2023-10-13 14:12:32 (GMT) | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-10-13 14:12:32 (GMT) | 
| commit | a7e2a10a85bb597d3bb8f9303214bd0524fa54c3 (patch) | |
| tree | 9767640a38dfaa2e297492a45ab13030830443bd /Lib/asyncio/windows_events.py | |
| parent | 0ed2329a1627fc8ae97b009114cd960c25567f75 (diff) | |
| download | cpython-a7e2a10a85bb597d3bb8f9303214bd0524fa54c3.zip cpython-a7e2a10a85bb597d3bb8f9303214bd0524fa54c3.tar.gz cpython-a7e2a10a85bb597d3bb8f9303214bd0524fa54c3.tar.bz2  | |
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.py | 37 | 
1 files changed, 19 insertions, 18 deletions
diff --git a/Lib/asyncio/windows_events.py b/Lib/asyncio/windows_events.py index 4a4c4be..b62ea75 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)  | 
