diff options
author | Guido van Rossum <guido@python.org> | 2024-03-12 00:31:49 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-03-12 00:31:49 (GMT) |
commit | ba13215eb1ec20b6af10e3fcee7a725bd7a7f83e (patch) | |
tree | 19615f6a1d8d22a9fe494bcfbf2cfe5bb50bf1e9 /Lib/asyncio | |
parent | 2b67fc57f6e97c8389fe970ed232c1ad484113e1 (diff) | |
download | cpython-ba13215eb1ec20b6af10e3fcee7a725bd7a7f83e.zip cpython-ba13215eb1ec20b6af10e3fcee7a725bd7a7f83e.tar.gz cpython-ba13215eb1ec20b6af10e3fcee7a725bd7a7f83e.tar.bz2 |
gh-113538: Revert "gh-113538: Add asycio.Server.{close,abort}_clients (#114432)" (#116632)
Revert "gh-113538: Add asycio.Server.{close,abort}_clients (#114432)"
Reason: The new test doesn't always pass:
https://github.com/python/cpython/pull/116423#issuecomment-1989425489
This reverts commit 1d0d49a7e86257ff95b4de0685e6997d7533993c.
Diffstat (limited to 'Lib/asyncio')
-rw-r--r-- | Lib/asyncio/base_events.py | 25 | ||||
-rw-r--r-- | Lib/asyncio/events.py | 8 | ||||
-rw-r--r-- | Lib/asyncio/proactor_events.py | 4 | ||||
-rw-r--r-- | Lib/asyncio/selector_events.py | 6 |
4 files changed, 12 insertions, 31 deletions
diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py index f0e690b..6c5cf28 100644 --- a/Lib/asyncio/base_events.py +++ b/Lib/asyncio/base_events.py @@ -279,9 +279,7 @@ class Server(events.AbstractServer): ssl_handshake_timeout, ssl_shutdown_timeout=None): self._loop = loop self._sockets = sockets - # Weak references so we don't break Transport's ability to - # detect abandoned transports - self._clients = weakref.WeakSet() + self._active_count = 0 self._waiters = [] self._protocol_factory = protocol_factory self._backlog = backlog @@ -294,13 +292,14 @@ class Server(events.AbstractServer): def __repr__(self): return f'<{self.__class__.__name__} sockets={self.sockets!r}>' - def _attach(self, transport): + def _attach(self): assert self._sockets is not None - self._clients.add(transport) + self._active_count += 1 - def _detach(self, transport): - self._clients.discard(transport) - if len(self._clients) == 0 and self._sockets is None: + def _detach(self): + assert self._active_count > 0 + self._active_count -= 1 + if self._active_count == 0 and self._sockets is None: self._wakeup() def _wakeup(self): @@ -349,17 +348,9 @@ class Server(events.AbstractServer): self._serving_forever_fut.cancel() self._serving_forever_fut = None - if len(self._clients) == 0: + if self._active_count == 0: self._wakeup() - def close_clients(self): - for transport in self._clients.copy(): - transport.close() - - def abort_clients(self): - for transport in self._clients.copy(): - transport.abort() - async def start_serving(self): self._start_serving() # Skip one loop iteration so that all 'loop.add_reader' diff --git a/Lib/asyncio/events.py b/Lib/asyncio/events.py index be49546..6807493 100644 --- a/Lib/asyncio/events.py +++ b/Lib/asyncio/events.py @@ -175,14 +175,6 @@ class AbstractServer: """Stop serving. This leaves existing connections open.""" raise NotImplementedError - def close_clients(self): - """Close all active connections.""" - raise NotImplementedError - - def abort_clients(self): - """Close all active connections immediately.""" - raise NotImplementedError - def get_loop(self): """Get the event loop the Server object is attached to.""" raise NotImplementedError diff --git a/Lib/asyncio/proactor_events.py b/Lib/asyncio/proactor_events.py index 397a8cd..a512db6 100644 --- a/Lib/asyncio/proactor_events.py +++ b/Lib/asyncio/proactor_events.py @@ -63,7 +63,7 @@ class _ProactorBasePipeTransport(transports._FlowControlMixin, self._called_connection_lost = False self._eof_written = False if self._server is not None: - self._server._attach(self) + self._server._attach() self._loop.call_soon(self._protocol.connection_made, self) if waiter is not None: # only wake up the waiter when connection_made() has been called @@ -167,7 +167,7 @@ class _ProactorBasePipeTransport(transports._FlowControlMixin, self._sock = None server = self._server if server is not None: - server._detach(self) + server._detach() self._server = None self._called_connection_lost = True diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py index f94bf10..8e888d2 100644 --- a/Lib/asyncio/selector_events.py +++ b/Lib/asyncio/selector_events.py @@ -791,7 +791,7 @@ class _SelectorTransport(transports._FlowControlMixin, self._paused = False # Set when pause_reading() called if self._server is not None: - self._server._attach(self) + self._server._attach() loop._transports[self._sock_fd] = self def __repr__(self): @@ -868,8 +868,6 @@ class _SelectorTransport(transports._FlowControlMixin, if self._sock is not None: _warn(f"unclosed transport {self!r}", ResourceWarning, source=self) self._sock.close() - if self._server is not None: - self._server._detach(self) def _fatal_error(self, exc, message='Fatal error on transport'): # Should be called from exception handler only. @@ -908,7 +906,7 @@ class _SelectorTransport(transports._FlowControlMixin, self._loop = None server = self._server if server is not None: - server._detach(self) + server._detach() self._server = None def get_write_buffer_size(self): |