From a01fb39877241d4de511dcee291defc77501c8b3 Mon Sep 17 00:00:00 2001 From: Richard Oudkerk Date: Wed, 21 Aug 2013 19:45:19 +0100 Subject: Issue #18762: Print debug info on failure to create new forkserver process. Also modify test code to hopefully avoid deadlock on failure. --- Lib/multiprocessing/forkserver.py | 15 +++++++++++++++ Lib/test/_test_multiprocessing.py | 6 ++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/Lib/multiprocessing/forkserver.py b/Lib/multiprocessing/forkserver.py index 628808e..26bf0c3 100644 --- a/Lib/multiprocessing/forkserver.py +++ b/Lib/multiprocessing/forkserver.py @@ -66,6 +66,21 @@ def connect_to_new_process(fds): try: reduction.sendfds(client, allfds) return parent_r, parent_w + except OSError: + # XXX This is debugging info for Issue #18762 + import fcntl + L = [] + for fd in allfds: + try: + flags = fcntl.fcntl(fd, fcntl.F_GETFL) + except OSError as e: + L.append((fd, e)) + else: + L.append((fd, flags)) + print('*** connect_to_new_process: %r' % L, file=sys.stderr) + os.close(parent_r) + os.close(parent_w) + raise except: os.close(parent_r) os.close(parent_w) diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py index f777edc..f9be810 100644 --- a/Lib/test/_test_multiprocessing.py +++ b/Lib/test/_test_multiprocessing.py @@ -3386,7 +3386,8 @@ class TestForkAwareThreadLock(unittest.TestCase): if n > 1: p = multiprocessing.Process(target=cls.child, args=(n-1, conn)) p.start() - p.join() + conn.close() + p.join(timeout=5) else: conn.send(len(util._afterfork_registry)) conn.close() @@ -3397,8 +3398,9 @@ class TestForkAwareThreadLock(unittest.TestCase): old_size = len(util._afterfork_registry) p = multiprocessing.Process(target=self.child, args=(5, w)) p.start() + w.close() new_size = r.recv() - p.join() + p.join(timeout=5) self.assertLessEqual(new_size, old_size) # -- cgit v0.12