mirror of
https://github.com/python/cpython.git
synced 2025-12-23 09:19:18 +00:00
gh-79033: Try to fix asyncio.Server.wait_closed() again (GH-111336)
* Try to fix asyncio.Server.wait_closed() again
I identified the condition that `wait_closed()` is intended
to wait for: the server is closed *and* there are no more
active connections.
When this condition first becomes true, `_wakeup()` is called
(either from `close()` or from `_detach()`) and it sets `_waiters`
to `None`. So we just check for `self._waiters is None`; if it's
not `None`, we know we have to wait, and do so.
A problem was that the new test introduced in 3.12 explicitly
tested that `wait_closed()` returns immediately when the server
is *not* closed but there are currently no active connections.
This was a mistake (probably a misunderstanding of the intended
semantics). I've fixed the test, and added a separate test that
checks exactly for this scenario.
I also fixed an oddity where in `_wakeup()` the result of the
waiter was set to the waiter itself. This result is not used
anywhere and I changed this to `None`, to avoid a GC cycle.
* Update Lib/asyncio/base_events.py
---------
(cherry picked from commit
|
||
|---|---|---|
| .. | ||
| __init__.py | ||
| __main__.py | ||
| base_events.py | ||
| base_futures.py | ||
| base_subprocess.py | ||
| base_tasks.py | ||
| constants.py | ||
| coroutines.py | ||
| events.py | ||
| exceptions.py | ||
| format_helpers.py | ||
| futures.py | ||
| locks.py | ||
| log.py | ||
| mixins.py | ||
| proactor_events.py | ||
| protocols.py | ||
| queues.py | ||
| runners.py | ||
| selector_events.py | ||
| sslproto.py | ||
| staggered.py | ||
| streams.py | ||
| subprocess.py | ||
| taskgroups.py | ||
| tasks.py | ||
| threads.py | ||
| timeouts.py | ||
| transports.py | ||
| trsock.py | ||
| unix_events.py | ||
| windows_events.py | ||
| windows_utils.py | ||