asyncio: Fix unix pipe transport 'repr' methods
Patch by Vincent Michel. See also https://github.com/python/asyncio/pull/326
This commit is contained in:
parent
32dae3d50f
commit
5dc093336f
@ -329,14 +329,17 @@ class _UnixReadPipeTransport(transports.ReadTransport):
|
|||||||
elif self._closing:
|
elif self._closing:
|
||||||
info.append('closing')
|
info.append('closing')
|
||||||
info.append('fd=%s' % self._fileno)
|
info.append('fd=%s' % self._fileno)
|
||||||
if self._pipe is not None:
|
selector = getattr(self._loop, '_selector', None)
|
||||||
|
if self._pipe is not None and selector is not None:
|
||||||
polling = selector_events._test_selector_event(
|
polling = selector_events._test_selector_event(
|
||||||
self._loop._selector,
|
selector,
|
||||||
self._fileno, selectors.EVENT_READ)
|
self._fileno, selectors.EVENT_READ)
|
||||||
if polling:
|
if polling:
|
||||||
info.append('polling')
|
info.append('polling')
|
||||||
else:
|
else:
|
||||||
info.append('idle')
|
info.append('idle')
|
||||||
|
elif self._pipe is not None:
|
||||||
|
info.append('open')
|
||||||
else:
|
else:
|
||||||
info.append('closed')
|
info.append('closed')
|
||||||
return '<%s>' % ' '.join(info)
|
return '<%s>' % ' '.join(info)
|
||||||
@ -453,9 +456,10 @@ class _UnixWritePipeTransport(transports._FlowControlMixin,
|
|||||||
elif self._closing:
|
elif self._closing:
|
||||||
info.append('closing')
|
info.append('closing')
|
||||||
info.append('fd=%s' % self._fileno)
|
info.append('fd=%s' % self._fileno)
|
||||||
if self._pipe is not None:
|
selector = getattr(self._loop, '_selector', None)
|
||||||
|
if self._pipe is not None and selector is not None:
|
||||||
polling = selector_events._test_selector_event(
|
polling = selector_events._test_selector_event(
|
||||||
self._loop._selector,
|
selector,
|
||||||
self._fileno, selectors.EVENT_WRITE)
|
self._fileno, selectors.EVENT_WRITE)
|
||||||
if polling:
|
if polling:
|
||||||
info.append('polling')
|
info.append('polling')
|
||||||
@ -464,6 +468,8 @@ class _UnixWritePipeTransport(transports._FlowControlMixin,
|
|||||||
|
|
||||||
bufsize = self.get_write_buffer_size()
|
bufsize = self.get_write_buffer_size()
|
||||||
info.append('bufsize=%s' % bufsize)
|
info.append('bufsize=%s' % bufsize)
|
||||||
|
elif self._pipe is not None:
|
||||||
|
info.append('open')
|
||||||
else:
|
else:
|
||||||
info.append('closed')
|
info.append('closed')
|
||||||
return '<%s>' % ' '.join(info)
|
return '<%s>' % ' '.join(info)
|
||||||
|
@ -1366,6 +1366,41 @@ class EventLoopTestsMixin:
|
|||||||
# extra info is available
|
# extra info is available
|
||||||
self.assertIsNotNone(proto.transport.get_extra_info('pipe'))
|
self.assertIsNotNone(proto.transport.get_extra_info('pipe'))
|
||||||
|
|
||||||
|
@unittest.skipUnless(sys.platform != 'win32',
|
||||||
|
"Don't support pipes for Windows")
|
||||||
|
def test_unclosed_pipe_transport(self):
|
||||||
|
# This test reproduces the issue #314 on GitHub
|
||||||
|
loop = self.create_event_loop()
|
||||||
|
read_proto = MyReadPipeProto(loop=loop)
|
||||||
|
write_proto = MyWritePipeProto(loop=loop)
|
||||||
|
|
||||||
|
rpipe, wpipe = os.pipe()
|
||||||
|
rpipeobj = io.open(rpipe, 'rb', 1024)
|
||||||
|
wpipeobj = io.open(wpipe, 'w', 1024)
|
||||||
|
|
||||||
|
@asyncio.coroutine
|
||||||
|
def connect():
|
||||||
|
read_transport, _ = yield from loop.connect_read_pipe(
|
||||||
|
lambda: read_proto, rpipeobj)
|
||||||
|
write_transport, _ = yield from loop.connect_write_pipe(
|
||||||
|
lambda: write_proto, wpipeobj)
|
||||||
|
return read_transport, write_transport
|
||||||
|
|
||||||
|
# Run and close the loop without closing the transports
|
||||||
|
read_transport, write_transport = loop.run_until_complete(connect())
|
||||||
|
loop.close()
|
||||||
|
|
||||||
|
# These 'repr' calls used to raise an AttributeError
|
||||||
|
# See Issue #314 on GitHub
|
||||||
|
self.assertIn('open', repr(read_transport))
|
||||||
|
self.assertIn('open', repr(write_transport))
|
||||||
|
|
||||||
|
# Clean up (avoid ResourceWarning)
|
||||||
|
rpipeobj.close()
|
||||||
|
wpipeobj.close()
|
||||||
|
read_transport._pipe = None
|
||||||
|
write_transport._pipe = None
|
||||||
|
|
||||||
@unittest.skipUnless(sys.platform != 'win32',
|
@unittest.skipUnless(sys.platform != 'win32',
|
||||||
"Don't support pipes for Windows")
|
"Don't support pipes for Windows")
|
||||||
# select, poll and kqueue don't support character devices (PTY) on Mac OS X
|
# select, poll and kqueue don't support character devices (PTY) on Mac OS X
|
||||||
|
Loading…
x
Reference in New Issue
Block a user