8000 Fix _UnixReadPipeTransport and _UnixWritePipeTransport · python/asyncio@5fe382d · GitHub
[go: up one dir, main page]

Skip to content
This repository was archived by the owner on Nov 23, 2017. It is now read-only.

Commit 5fe382d

Browse files
committed
Fix _UnixReadPipeTransport and _UnixWritePipeTransport
Only start reading when connection_made() has been called.
1 parent c662822 commit 5fe382d

File tree

2 files changed

+22
-24
lines changed

2 files changed

+22
-24
lines changed

asyncio/unix_events.py

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -298,8 +298,10 @@ def __init__(self, loop, pipe, protocol, waiter=None, extra=None):
298298
_set_nonblocking(self._fileno)
299299
self._protocol = protocol
300300
self._closing = False
301-
self._loop.add_reader(self._fileno, self._read_ready)
302301
self._loop.call_soon(self._protocol.connection_made, self)
302+
# only start reading when connection_made() has been called
303+
self._loop.call_soon(self._loop.add_reader,
304+
self._fileno, self._read_ready)
303305
if waiter is not None:
304306
# only wake up the waiter when connection_made() has been called
305307
self._loop.call_soon(waiter._set_result_unless_cancelled, None)
@@ -401,13 +403,16 @@ def __init__(self, loop, pipe, protocol, waiter=None, extra=None):
401403
self._conn_lost = 0
402404
self._closing = False # Set when close() or write_eof() called.
403405

404-
# On AIX, the reader trick only works for sockets.
405-
# On other platforms it works for pipes and sockets.
406-
# (Exception: OS X 10.4? Issue #19294.)
406+
self._loop.call_soon(self._protocol.connection_made, self)
407+
408+
# On AIX, the reader trick (to be notified when the read end of the
409+
# socket is closed) only works for sockets. On other platforms it
410+
# works for pipes and sockets. (Exception: OS X 10.4? Issue #19294.)
407411
if is_socket or not sys.platform.startswith("aix"):
408-
self._loop.add_reader(self._fileno, self._read_ready)
412+
# only start reading when connection_made() has been called
413+
self._loop.call_soon(self._loop.add_reader,
414+
self._fileno, self._read_ready)
409415

410-
self._loop.call_soon(self._protocol.connection_made, self)
411416
if waiter is not None:
412417
# only wake up the waiter when connection_made() has been called
413418
self._loop.call_soon(waiter._set_result_unless_cancelled, None)

tests/test_unix_events.py

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -350,16 +350,13 @@ def read_pipe_transport(self, waiter=None):
350350
return transport
351351

352352
def test_ctor(self):
353-
tr = self.read_pipe_transport()
354-
self.loop.assert_reader(5, tr._read_ready)
355-
test_utils.run_briefly(self.loop)
356-
self.protocol.connection_made.assert_called_with(tr)
353+
waiter = asyncio.Future(loop=self.loop)
354+
tr = self.read_pipe_transport(waiter=waiter)
355+
self.loop.run_until_complete(waiter)
357356

358-
def test_ctor_with_waiter(self):
359-
fut = asyncio.Future(loop=self.loop)
360-
tr = self.read_pipe_transport(waiter=fut)
361-
test_utils.run_briefly(self.loop)
362-
self.assertIsNone(fut.result())
357+
self.protocol.connection_made.assert_called_with(tr)
358+
self.loop.assert_reader(5, tr._read_ready)
359+
self.assertIsNone(waiter.result())
363360

364361
@mock.patch('os.read')
365362
def test__read_ready(self, m_read):
@@ -502,17 +499,13 @@ def write_pipe_transport(self, waiter=None):
502499
return transport
503500

504501
def test_ctor(self):
505-
tr = self.write_pipe_transport()
506-
self.loop.assert_reader(5, tr._read_ready)
507-
test_utils.run_briefly(self.loop)
508-
self.protocol.connection_made.assert_called_with(tr)
502+
waiter = asyncio.Future(loop=self.loop)
503+
tr = self.write_pipe_transport(waiter=waiter)
504+
self.loop.run_until_complete(waiter)
509505

510-
def test_ctor_with_waiter(self):
511-
fut = asyncio.Future(loop=self.loop)
512-
tr = self.write_pipe_transport(waiter=fut)
506+
self.protocol.connection_made.assert_called_with(tr)
513507
self.loop.assert_reader(5, tr._read_ready)
514-
test_utils.run_briefly(self.loop)
515-
self.assertEqual(None, fut.result())
508+
self.assertEqual(None, waiter.result())
516509

517510
def test_can_write_eof(self):
518511
tr = self.write_pipe_transport()

0 commit comments

Comments
 (0)
0