mirror of https://github.com/python/cpython
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:
parent
e4495877dd
commit
129a414490
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue