Commit c7dc55eb authored by Victor Stinner's avatar Victor Stinner

Merge 3.4 (asyncio)

parents 0eb1896a f67f4602
...@@ -28,49 +28,51 @@ STDOUT = subprocess.STDOUT ...@@ -28,49 +28,51 @@ STDOUT = subprocess.STDOUT
_mmap_counter = itertools.count() _mmap_counter = itertools.count()
# Replacement for socket.socketpair() if hasattr(socket, 'socketpair'):
# Since Python 3.5, socket.socketpair() is now also available on Windows
socketpair = socket.socketpair
def socketpair(family=socket.AF_INET, type=socket.SOCK_STREAM, proto=0): else:
"""A socket pair usable as a self-pipe, for Windows. # Replacement for socket.socketpair()
def socketpair(family=socket.AF_INET, type=socket.SOCK_STREAM, proto=0):
Origin: https://gist.github.com/4325783, by Geert Jansen. Public domain. """A socket pair usable as a self-pipe, for Windows.
"""
if family == socket.AF_INET: Origin: https://gist.github.com/4325783, by Geert Jansen. Public domain.
host = '127.0.0.1' """
elif family == socket.AF_INET6: if family == socket.AF_INET:
host = '::1' host = '127.0.0.1'
else: elif family == socket.AF_INET6:
raise ValueError("Ony AF_INET and AF_INET6 socket address families " host = '::1'
"are supported") else:
if type != socket.SOCK_STREAM: raise ValueError("Only AF_INET and AF_INET6 socket address families "
raise ValueError("Only SOCK_STREAM socket type is supported") "are supported")
if proto != 0: if type != socket.SOCK_STREAM:
raise ValueError("Only protocol zero is supported") raise ValueError("Only SOCK_STREAM socket type is supported")
if proto != 0:
# We create a connected TCP socket. Note the trick with setblocking(0) raise ValueError("Only protocol zero is supported")
# that prevents us from having to create a thread.
lsock = socket.socket(family, type, proto) # We create a connected TCP socket. Note the trick with setblocking(0)
try: # that prevents us from having to create a thread.
lsock.bind((host, 0)) lsock = socket.socket(family, type, proto)
lsock.listen(1)
# On IPv6, ignore flow_info and scope_id
addr, port = lsock.getsockname()[:2]
csock = socket.socket(family, type, proto)
try: try:
csock.setblocking(False) lsock.bind((host, 0))
lsock.listen(1)
# On IPv6, ignore flow_info and scope_id
addr, port = lsock.getsockname()[:2]
csock = socket.socket(family, type, proto)
try: try:
csock.connect((addr, port)) csock.setblocking(False)
except (BlockingIOError, InterruptedError): try:
pass csock.connect((addr, port))
ssock, _ = lsock.accept() except (BlockingIOError, InterruptedError):
csock.setblocking(True) pass
except: csock.setblocking(True)
csock.close() ssock, _ = lsock.accept()
raise except:
finally: csock.close()
lsock.close() raise
return (ssock, csock) finally:
lsock.close()
return (ssock, csock)
# Replacement for os.pipe() using handles instead of fds # Replacement for os.pipe() using handles instead of fds
......
...@@ -33,6 +33,8 @@ class WinsocketpairTests(unittest.TestCase): ...@@ -33,6 +33,8 @@ class WinsocketpairTests(unittest.TestCase):
ssock, csock = windows_utils.socketpair(family=socket.AF_INET6) ssock, csock = windows_utils.socketpair(family=socket.AF_INET6)
self.check_winsocketpair(ssock, csock) self.check_winsocketpair(ssock, csock)
@unittest.skipIf(hasattr(socket, 'socketpair'),
'socket.socketpair is available')
@mock.patch('asyncio.windows_utils.socket') @mock.patch('asyncio.windows_utils.socket')
def test_winsocketpair_exc(self, m_socket): def test_winsocketpair_exc(self, m_socket):
m_socket.AF_INET = socket.AF_INET m_socket.AF_INET = socket.AF_INET
...@@ -51,6 +53,8 @@ class WinsocketpairTests(unittest.TestCase): ...@@ -51,6 +53,8 @@ class WinsocketpairTests(unittest.TestCase):
self.assertRaises(ValueError, self.assertRaises(ValueError,
windows_utils.socketpair, proto=1) windows_utils.socketpair, proto=1)
@unittest.skipIf(hasattr(socket, 'socketpair'),
'socket.socketpair is available')
@mock.patch('asyncio.windows_utils.socket') @mock.patch('asyncio.windows_utils.socket')
def test_winsocketpair_close(self, m_socket): def test_winsocketpair_close(self, m_socket):
m_socket.AF_INET = socket.AF_INET m_socket.AF_INET = socket.AF_INET
......
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