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.
This commit is contained in:
Victor Stinner 2015-12-15 11:29:59 +01:00
parent e4495877dd
commit 129a414490
1 changed files with 15 additions and 5 deletions

View File

@ -377,10 +377,10 @@ class SignalEINTRTest(EINTRBaseTest):
@unittest.skipUnless(hasattr(signal, 'sigwaitinfo'), @unittest.skipUnless(hasattr(signal, 'sigwaitinfo'),
'need signal.sigwaitinfo()') 'need signal.sigwaitinfo()')
def test_sigwaitinfo(self): def test_sigwaitinfo(self):
# Issue #25277: The sleep is a weak synchronization between the parent # Issue #25277, #25868: give a few miliseconds to the parent process
# and the child process. If the sleep is too low, the test hangs on # between os.write() and signal.sigwaitinfo() to works around a race
# slow or highly loaded systems. # condition
self.sleep_time = 2.0 self.sleep_time = 0.100
signum = signal.SIGUSR1 signum = signal.SIGUSR1
pid = os.getpid() pid = os.getpid()
@ -388,18 +388,28 @@ class SignalEINTRTest(EINTRBaseTest):
old_handler = signal.signal(signum, lambda *args: None) old_handler = signal.signal(signum, lambda *args: None)
self.addCleanup(signal.signal, signum, old_handler) self.addCleanup(signal.signal, signum, old_handler)
rpipe, wpipe = os.pipe()
code = '\n'.join(( code = '\n'.join((
'import os, time', 'import os, time',
'pid = %s' % os.getpid(), 'pid = %s' % os.getpid(),
'signum = %s' % int(signum), 'signum = %s' % int(signum),
'sleep_time = %r' % self.sleep_time, 'sleep_time = %r' % self.sleep_time,
'rpipe = %r' % rpipe,
'os.read(rpipe, 1)',
'os.close(rpipe)',
'time.sleep(sleep_time)', 'time.sleep(sleep_time)',
'os.kill(pid, signum)', 'os.kill(pid, signum)',
)) ))
t0 = time.monotonic() t0 = time.monotonic()
proc = self.subprocess(code) proc = self.subprocess(code, pass_fds=(rpipe,))
os.close(rpipe)
with kill_on_error(proc): with kill_on_error(proc):
# sync child-parent
os.write(wpipe, b'x')
os.close(wpipe)
# parent # parent
signal.sigwaitinfo([signum]) signal.sigwaitinfo([signum])
dt = time.monotonic() - t0 dt = time.monotonic() - t0