summaryrefslogtreecommitdiffstats
path: root/Lib/test/eintrdata
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2015-12-15 10:29:59 (GMT)
committerVictor Stinner <victor.stinner@gmail.com>2015-12-15 10:29:59 (GMT)
commit129a41449071928cc7afcb4789cfae22b08607b3 (patch)
treecdd8219335db657c4635b1c1b0a5ec92b930c838 /Lib/test/eintrdata
parente4495877dd08b4d0568bb8a75ae5c69b3d91ff60 (diff)
downloadcpython-129a41449071928cc7afcb4789cfae22b08607b3.zip
cpython-129a41449071928cc7afcb4789cfae22b08607b3.tar.gz
cpython-129a41449071928cc7afcb4789cfae22b08607b3.tar.bz2
Issue #25868: Try to make test_eintr.test_sigwaitinfo() more reliable
especially on slow buildbots Use a pipe to synchronize the parent and the child processes.
Diffstat (limited to 'Lib/test/eintrdata')
-rw-r--r--Lib/test/eintrdata/eintr_tester.py20
1 files changed, 15 insertions, 5 deletions
diff --git a/Lib/test/eintrdata/eintr_tester.py b/Lib/test/eintrdata/eintr_tester.py
index ee6e75b..531d576 100644
--- a/Lib/test/eintrdata/eintr_tester.py
+++ b/Lib/test/eintrdata/eintr_tester.py
@@ -377,10 +377,10 @@ class SignalEINTRTest(EINTRBaseTest):
@unittest.skipUnless(hasattr(signal, 'sigwaitinfo'),
'need signal.sigwaitinfo()')
def test_sigwaitinfo(self):
- # Issue #25277: The sleep is a weak synchronization between the parent
- # and the child process. If the sleep is too low, the test hangs on
- # slow or highly loaded systems.
- self.sleep_time = 2.0
+ # Issue #25277, #25868: give a few miliseconds to the parent process
+ # between os.write() and signal.sigwaitinfo() to works around a race
+ # condition
+ self.sleep_time = 0.100
signum = signal.SIGUSR1
pid = os.getpid()
@@ -388,18 +388,28 @@ class SignalEINTRTest(EINTRBaseTest):
old_handler = signal.signal(signum, lambda *args: None)
self.addCleanup(signal.signal, signum, old_handler)
+ rpipe, wpipe = os.pipe()
+
code = '\n'.join((
'import os, time',
'pid = %s' % os.getpid(),
'signum = %s' % int(signum),
'sleep_time = %r' % self.sleep_time,
+ 'rpipe = %r' % rpipe,
+ 'os.read(rpipe, 1)',
+ 'os.close(rpipe)',
'time.sleep(sleep_time)',
'os.kill(pid, signum)',
))
t0 = time.monotonic()
- proc = self.subprocess(code)
+ proc = self.subprocess(code, pass_fds=(rpipe,))
+ os.close(rpipe)
with kill_on_error(proc):
+ # sync child-parent
+ os.write(wpipe, b'x')
+ os.close(wpipe)
+
# parent
signal.sigwaitinfo([signum])
dt = time.monotonic() - t0