Commit 2e413f7c authored by Yury Selivanov's avatar Yury Selivanov

Merge 3.5 (asyncio)

parents 8308db5c 5dc09333
...@@ -329,14 +329,17 @@ class _UnixReadPipeTransport(transports.ReadTransport): ...@@ -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)
...@@ -454,9 +457,10 @@ class _UnixWritePipeTransport(transports._FlowControlMixin, ...@@ -454,9 +457,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')
...@@ -465,6 +469,8 @@ class _UnixWritePipeTransport(transports._FlowControlMixin, ...@@ -465,6 +469,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: ...@@ -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
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment