mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
asyncio: sync with Tulip
* Tulip issue #183: log socket events in debug mode - Log most important socket events: socket connected, new client, connection reset or closed by peer (EOF), etc. - Log time elapsed in DNS resolution (getaddrinfo) - Log pause/resume reading - Log time of SSL handshake - Log SSL handshake errors - Add a __repr__() method to many classes * Fix ProactorEventLoop() in debug mode. ProactorEventLoop._make_self_pipe() doesn't call call_soon() directly because it checks for the current loop which fails, because the method is called to build the event loop. * Cleanup _ProactorReadPipeTransport constructor. Not need to set again _read_fut attribute to None, it is already done in the base class.
This commit is contained in:
parent
8ebeb03740
commit
e912e652f8
7 changed files with 219 additions and 29 deletions
|
@ -16,6 +16,7 @@ from . import base_subprocess
|
|||
from . import constants
|
||||
from . import events
|
||||
from . import selector_events
|
||||
from . import selectors
|
||||
from . import transports
|
||||
from .coroutines import coroutine
|
||||
from .log import logger
|
||||
|
@ -272,6 +273,20 @@ class _UnixReadPipeTransport(transports.ReadTransport):
|
|||
# wait until protocol.connection_made() has been called
|
||||
self._loop.call_soon(waiter._set_result_unless_cancelled, None)
|
||||
|
||||
def __repr__(self):
|
||||
info = [self.__class__.__name__, 'fd=%s' % self._fileno]
|
||||
if self._pipe is not None:
|
||||
polling = selector_events._test_selector_event(
|
||||
self._loop._selector,
|
||||
self._fileno, selectors.EVENT_READ)
|
||||
if polling:
|
||||
info.append('polling')
|
||||
else:
|
||||
info.append('idle')
|
||||
else:
|
||||
info.append('closed')
|
||||
return '<%s>' % ' '.join(info)
|
||||
|
||||
def _read_ready(self):
|
||||
try:
|
||||
data = os.read(self._fileno, self.max_size)
|
||||
|
@ -283,6 +298,8 @@ class _UnixReadPipeTransport(transports.ReadTransport):
|
|||
if data:
|
||||
self._protocol.data_received(data)
|
||||
else:
|
||||
if self._loop.get_debug():
|
||||
logger.info("%r was closed by peer", self)
|
||||
self._closing = True
|
||||
self._loop.remove_reader(self._fileno)
|
||||
self._loop.call_soon(self._protocol.eof_received)
|
||||
|
@ -357,11 +374,30 @@ class _UnixWritePipeTransport(transports._FlowControlMixin,
|
|||
# wait until protocol.connection_made() has been called
|
||||
self._loop.call_soon(waiter._set_result_unless_cancelled, None)
|
||||
|
||||
def __repr__(self):
|
||||
info = [self.__class__.__name__, 'fd=%s' % self._fileno]
|
||||
if self._pipe is not None:
|
||||
polling = selector_events._test_selector_event(
|
||||
self._loop._selector,
|
||||
self._fileno, selectors.EVENT_WRITE)
|
||||
if polling:
|
||||
info.append('polling')
|
||||
else:
|
||||
info.append('idle')
|
||||
|
||||
bufsize = self.get_write_buffer_size()
|
||||
info.append('bufsize=%s' % bufsize)
|
||||
else:
|
||||
info.append('closed')
|
||||
return '<%s>' % ' '.join(info)
|
||||
|
||||
def get_write_buffer_size(self):
|
||||
return sum(len(data) for data in self._buffer)
|
||||
|
||||
def _read_ready(self):
|
||||
# Pipe was closed by peer.
|
||||
if self._loop.get_debug():
|
||||
logger.info("%r was closed by peer", self)
|
||||
if self._buffer:
|
||||
self._close(BrokenPipeError())
|
||||
else:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue