cpython: e9c37e3efcb2 (original) (raw)
Mercurial > cpython
changeset 103835:e9c37e3efcb2
Merge 3.6 (issue #28174) [#28174]
Yury Selivanov yury@magic.io | |
---|---|
date | Thu, 15 Sep 2016 15:46:40 -0400 |
parents | ac13bf1967b5(current diff)f2fdb624074a(diff) |
children | 1dbe3addba28 |
files | Misc/NEWS |
diffstat | 3 files changed, 27 insertions(+), 12 deletions(-)[+] [-] Lib/asyncio/base_events.py 25 Lib/test/test_asyncio/test_base_events.py 11 Misc/NEWS 3 |
line wrap: on
line diff
--- a/Lib/asyncio/base_events.py +++ b/Lib/asyncio/base_events.py @@ -76,6 +76,17 @@ def _format_pipe(fd): return repr(fd) +def _set_reuseport(sock):
- if not hasattr(socket, 'SO_REUSEPORT'):
raise ValueError('reuse_port not supported by socket module')[](#l1.9)
- else:
try:[](#l1.11)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)[](#l1.12)
except OSError:[](#l1.13)
raise ValueError('reuse_port not supported by socket module, '[](#l1.14)
'SO_REUSEPORT defined but not implemented.')[](#l1.15)
Linux's sock.type is a bitmask that can include extra info about socket.
_SOCKET_TYPE_MASK = 0 if hasattr(socket, 'SOCK_NONBLOCK'): @@ -874,12 +885,7 @@ class BaseEventLoop(events.AbstractEvent sock.setsockopt( socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) if reuse_port:
if not hasattr(socket, 'SO_REUSEPORT'):[](#l1.25)
raise ValueError([](#l1.26)
'reuse_port not supported by socket module')[](#l1.27)
else:[](#l1.28)
sock.setsockopt([](#l1.29)
socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)[](#l1.30)
_set_reuseport(sock)[](#l1.31) if allow_broadcast:[](#l1.32) sock.setsockopt([](#l1.33) socket.SOL_SOCKET, socket.SO_BROADCAST, 1)[](#l1.34)
@@ -1002,12 +1008,7 @@ class BaseEventLoop(events.AbstractEvent sock.setsockopt( socket.SOL_SOCKET, socket.SO_REUSEADDR, True) if reuse_port:
if not hasattr(socket, 'SO_REUSEPORT'):[](#l1.39)
raise ValueError([](#l1.40)
'reuse_port not supported by socket module')[](#l1.41)
else:[](#l1.42)
sock.setsockopt([](#l1.43)
socket.SOL_SOCKET, socket.SO_REUSEPORT, True)[](#l1.44)
_set_reuseport(sock)[](#l1.45) # Disable IPv4/IPv6 dual stack support (enabled by[](#l1.46) # default on Linux) which makes a single socket[](#l1.47) # listen on both address families.[](#l1.48)
--- a/Lib/test/test_asyncio/test_base_events.py +++ b/Lib/test/test_asyncio/test_base_events.py @@ -1371,6 +1371,17 @@ class BaseEventLoopWithSelectorTests(tes self.assertRaises(ValueError, self.loop.run_until_complete, f) @patch_socket
- def test_create_server_soreuseport_only_defined(self, m_socket):
m_socket.getaddrinfo = socket.getaddrinfo[](#l2.8)
m_socket.socket.return_value = mock.Mock()[](#l2.9)
m_socket.SO_REUSEPORT = -1[](#l2.10)
f = self.loop.create_server([](#l2.12)
MyProto, '0.0.0.0', 0, reuse_port=True)[](#l2.13)
self.assertRaises(ValueError, self.loop.run_until_complete, f)[](#l2.15)