Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit b44fc32

Browse files
committed
(Merge 3.4) asyncion, Tulip issue 181: BaseEventLoop.create_datagram_endpoint()
now waits until protocol.connection_made() has been called. Document also why transport constructors use a waiter.
2 parents 5f40168 + bfff45d commit b44fc32

5 files changed

Lines changed: 28 additions & 5 deletions

File tree

Lib/asyncio/base_events.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ def _make_ssl_transport(self, rawsock, protocol, sslcontext, waiter, *,
169169
raise NotImplementedError
170170

171171
def _make_datagram_transport(self, sock, protocol,
172-
address=None, extra=None):
172+
address=None, waiter=None, extra=None):
173173
"""Create datagram transport."""
174174
raise NotImplementedError
175175

@@ -605,7 +605,10 @@ def create_datagram_endpoint(self, protocol_factory,
605605
raise exceptions[0]
606606

607607
protocol = protocol_factory()
608-
transport = self._make_datagram_transport(sock, protocol, r_addr)
608+
waiter = futures.Future(loop=self)
609+
transport = self._make_datagram_transport(sock, protocol, r_addr,
610+
waiter)
611+
yield from waiter
609612
return transport, protocol
610613

611614
@coroutine

Lib/asyncio/proactor_events.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ def __init__(self, loop, sock, protocol, waiter=None,
3838
self._server.attach(self)
3939
self._loop.call_soon(self._protocol.connection_made, self)
4040
if waiter is not None:
41+
# wait until protocol.connection_made() has been called
4142
self._loop.call_soon(waiter._set_result_unless_cancelled, None)
4243

4344
def _set_extra(self, sock):

Lib/asyncio/selector_events.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,9 @@ def _make_ssl_transport(self, rawsock, protocol, sslcontext, waiter, *,
5151
server_side, server_hostname, extra, server)
5252

5353
def _make_datagram_transport(self, sock, protocol,
54-
address=None, extra=None):
55-
return _SelectorDatagramTransport(self, sock, protocol, address, extra)
54+
address=None, waiter=None, extra=None):
55+
return _SelectorDatagramTransport(self, sock, protocol,
56+
address, waiter, extra)
5657

5758
def close(self):
5859
if self.is_closed():
@@ -481,6 +482,7 @@ def __init__(self, loop, sock, protocol, waiter=None,
481482
self._loop.add_reader(self._sock_fd, self._read_ready)
482483
self._loop.call_soon(self._protocol.connection_made, self)
483484
if waiter is not None:
485+
# wait until protocol.connection_made() has been called
484486
self._loop.call_soon(waiter._set_result_unless_cancelled, None)
485487

486488
def pause_reading(self):
@@ -690,6 +692,7 @@ def _on_handshake(self):
690692
self._loop.add_reader(self._sock_fd, self._read_ready)
691693
self._loop.call_soon(self._protocol.connection_made, self)
692694
if self._waiter is not None:
695+
# wait until protocol.connection_made() has been called
693696
self._loop.call_soon(self._waiter._set_result_unless_cancelled,
694697
None)
695698

@@ -806,11 +809,15 @@ class _SelectorDatagramTransport(_SelectorTransport):
806809

807810
_buffer_factory = collections.deque
808811

809-
def __init__(self, loop, sock, protocol, address=None, extra=None):
812+
def __init__(self, loop, sock, protocol, address=None,
813+
waiter=None, extra=None):
810814
super().__init__(loop, sock, protocol, extra)
811815
self._address = address
812816
self._loop.add_reader(self._sock_fd, self._read_ready)
813817
self._loop.call_soon(self._protocol.connection_made, self)
818+
if waiter is not None:
819+
# wait until protocol.connection_made() has been called
820+
self._loop.call_soon(waiter._set_result_unless_cancelled, None)
814821

815822
def get_write_buffer_size(self):
816823
return sum(len(data) for data, _ in self._buffer)

Lib/asyncio/unix_events.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,7 @@ def __init__(self, loop, pipe, protocol, waiter=None, extra=None):
269269
self._loop.add_reader(self._fileno, self._read_ready)
270270
self._loop.call_soon(self._protocol.connection_made, self)
271271
if waiter is not None:
272+
# wait until protocol.connection_made() has been called
272273
self._loop.call_soon(waiter._set_result_unless_cancelled, None)
273274

274275
def _read_ready(self):
@@ -353,6 +354,7 @@ def __init__(self, loop, pipe, protocol, waiter=None, extra=None):
353354

354355
self._loop.call_soon(self._protocol.connection_made, self)
355356
if waiter is not None:
357+
# wait until protocol.connection_made() has been called
356358
self._loop.call_soon(waiter._set_result_unless_cancelled, None)
357359

358360
def get_write_buffer_size(self):

Lib/test/test_asyncio/test_events.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -522,6 +522,7 @@ def _basetest_create_connection(self, connection_fut, check_sockname=True):
522522
tr, pr = self.loop.run_until_complete(connection_fut)
523523
self.assertIsInstance(tr, asyncio.Transport)
524524
self.assertIsInstance(pr, asyncio.Protocol)
525+
self.assertIs(pr.transport, tr)
525526
if check_sockname:
526527
self.assertIsNotNone(tr.get_extra_info('sockname'))
527528
self.loop.run_until_complete(pr.done)
@@ -1045,12 +1046,21 @@ def datagram_received(self, data, addr):
10451046
s_transport, server = self.loop.run_until_complete(coro)
10461047
host, port = s_transport.get_extra_info('sockname')
10471048

1049+
self.assertIsInstance(s_transport, asyncio.Transport)
1050+
self.assertIsInstance(server, TestMyDatagramProto)
1051+
self.assertEqual('INITIALIZED', server.state)
1052+
self.assertIs(server.transport, s_transport)
1053+
10481054
coro = self.loop.create_datagram_endpoint(
10491055
lambda: MyDatagramProto(loop=self.loop),
10501056
remote_addr=(host, port))
10511057
transport, client = self.loop.run_until_complete(coro)
10521058

1059+
self.assertIsInstance(transport, asyncio.Transport)
1060+
self.assertIsInstance(client, MyDatagramProto)
10531061
self.assertEqual('INITIALIZED', client.state)
1062+
self.assertIs(client.transport, transport)
1063+
10541064
transport.sendto(b'xxx')
10551065
test_utils.run_until(self.loop, lambda: server.nbytes)
10561066
self.assertEqual(3, server.nbytes)

0 commit comments

Comments
 (0)