Fix for issue 14725 for 2.7 branch

This commit is contained in:
Richard Oudkerk 2012-05-05 20:41:08 +01:00
parent c642f67c63
commit 9a16fa69dd
3 changed files with 22 additions and 1 deletions

View File

@ -348,7 +348,10 @@ if sys.platform == 'win32':
try: try:
win32.ConnectNamedPipe(handle, win32.NULL) win32.ConnectNamedPipe(handle, win32.NULL)
except WindowsError, e: except WindowsError, e:
if e.args[0] != win32.ERROR_PIPE_CONNECTED: # ERROR_NO_DATA can occur if a client has already connected,
# written data and then disconnected -- see Issue 14725.
if e.args[0] not in (win32.ERROR_PIPE_CONNECTED,
win32.ERROR_NO_DATA):
raise raise
return _multiprocessing.PipeConnection(handle) return _multiprocessing.PipeConnection(handle)

View File

@ -1669,6 +1669,23 @@ class _TestListenerClient(BaseTestCase):
self.assertEqual(conn.recv(), 'hello') self.assertEqual(conn.recv(), 'hello')
p.join() p.join()
l.close() l.close()
def test_issue14725(self):
l = self.connection.Listener()
p = self.Process(target=self._test, args=(l.address,))
p.daemon = True
p.start()
time.sleep(1)
# On Windows the client process should by now have connected,
# written data and closed the pipe handle by now. This causes
# ConnectNamdedPipe() to fail with ERROR_NO_DATA. See Issue
# 14725.
conn = l.accept()
self.assertEqual(conn.recv(), 'hello')
conn.close()
p.join()
l.close()
# #
# Test of sending connection and socket objects between processes # Test of sending connection and socket objects between processes
# #

View File

@ -244,6 +244,7 @@ create_win32_namespace(void)
Py_INCREF(&Win32Type); Py_INCREF(&Win32Type);
WIN32_CONSTANT(F_DWORD, ERROR_ALREADY_EXISTS); WIN32_CONSTANT(F_DWORD, ERROR_ALREADY_EXISTS);
WIN32_CONSTANT(F_DWORD, ERROR_NO_DATA);
WIN32_CONSTANT(F_DWORD, ERROR_PIPE_BUSY); WIN32_CONSTANT(F_DWORD, ERROR_PIPE_BUSY);
WIN32_CONSTANT(F_DWORD, ERROR_PIPE_CONNECTED); WIN32_CONSTANT(F_DWORD, ERROR_PIPE_CONNECTED);
WIN32_CONSTANT(F_DWORD, ERROR_SEM_TIMEOUT); WIN32_CONSTANT(F_DWORD, ERROR_SEM_TIMEOUT);