summaryrefslogtreecommitdiffstats
path: root/Lib/test
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2013-10-17 09:48:32 (GMT)
committerSerhiy Storchaka <storchaka@gmail.com>2013-10-17 09:48:32 (GMT)
commita3cf1aa86446bbb8f14d29fb913349f895f4f1ea (patch)
tree7aba5cff156414527c644693144bd29dae7dde4c /Lib/test
parentb5f8a5e1345f122254a8f7d64bd520f8e07fde39 (diff)
parentd44500affecd88dade4024f3a6d3efa52bd1a026 (diff)
downloadcpython-a3cf1aa86446bbb8f14d29fb913349f895f4f1ea.zip
cpython-a3cf1aa86446bbb8f14d29fb913349f895f4f1ea.tar.gz
cpython-a3cf1aa86446bbb8f14d29fb913349f895f4f1ea.tar.bz2
Merge heads
Diffstat (limited to 'Lib/test')
-rw-r--r--Lib/test/_test_multiprocessing.py13
1 files changed, 13 insertions, 0 deletions
diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py
index 910cfa9..ac1b2a7 100644
--- a/Lib/test/_test_multiprocessing.py
+++ b/Lib/test/_test_multiprocessing.py
@@ -300,6 +300,9 @@ class _TestProcess(BaseTestCase):
p.terminate()
if hasattr(signal, 'alarm'):
+ # On the Gentoo buildbot waitpid() often seems to block forever.
+ # We use alarm() to interrupt it if it blocks for too long, and
+ # then try to print a backtrace for the child process using gdb.
def handler(*args):
raise RuntimeError('join took too long: %s' % p)
old_handler = signal.signal(signal.SIGALRM, handler)
@@ -307,6 +310,16 @@ class _TestProcess(BaseTestCase):
signal.alarm(10)
self.assertEqual(join(), None)
signal.alarm(0)
+ except RuntimeError:
+ print('os.waitpid() =', os.waitpid(p.pid, os.WNOHANG))
+ import subprocess
+ p = subprocess.Popen(['gdb', sys.executable, str(p.pid)],
+ stdin=subprocess.PIPE)
+ try:
+ p.communicate(b'bt 50', timeout=10)
+ except subprocess.TimeoutExpired:
+ p.kill()
+ raise
finally:
signal.signal(signal.SIGALRM, old_handler)
else: