diff options
| author | Neal Norwitz <nnorwitz@gmail.com> | 2006-07-30 19:20:42 (GMT) | 
|---|---|---|
| committer | Neal Norwitz <nnorwitz@gmail.com> | 2006-07-30 19:20:42 (GMT) | 
| commit | 313f8a903c6ad5fd7adc1167540becca3381dbb3 (patch) | |
| tree | d138b48993ae0b161a2bf6041ddb65dce9f831c6 /Lib/test/test_signal.py | |
| parent | ec3c5e396e58b19fdd4e4bd722eb56d431ca38af (diff) | |
| download | cpython-313f8a903c6ad5fd7adc1167540becca3381dbb3.zip cpython-313f8a903c6ad5fd7adc1167540becca3381dbb3.tar.gz cpython-313f8a903c6ad5fd7adc1167540becca3381dbb3.tar.bz2  | |
Try to prevent hangs on Tru64/Alpha buildbot.  I'm not certain this will help
and may need to be reverted if it causes problems.
Diffstat (limited to 'Lib/test/test_signal.py')
| -rw-r--r-- | Lib/test/test_signal.py | 38 | 
1 files changed, 37 insertions, 1 deletions
diff --git a/Lib/test/test_signal.py b/Lib/test/test_signal.py index 8dff1f5..d52902e 100644 --- a/Lib/test/test_signal.py +++ b/Lib/test/test_signal.py @@ -43,7 +43,8 @@ def handlerB(*args):          print "handlerB", args      raise HandlerBCalled, args -signal.alarm(20)                        # Entire test lasts at most 20 sec. +MAX_DURATION = 20 +signal.alarm(MAX_DURATION)   # Entire test should last at most 20 sec.  hup = signal.signal(signal.SIGHUP, handlerA)  usr1 = signal.signal(signal.SIGUSR1, handlerB)  usr2 = signal.signal(signal.SIGUSR2, signal.SIG_IGN) @@ -71,9 +72,34 @@ try:  except TypeError:      pass +# Set up a child to send an alarm signal to us (the parent) after waiting +# long enough to receive the alarm.  It seems we miss the alarm for some +# reason.  This will hopefully stop the hangs on Tru64/Alpha. +def force_test_exit(): +    # Sigh, both imports seem necessary to avoid errors. +    import os +    fork_pid = os.fork() +    if fork_pid == 0: +        # In child +        import os, time +        try: +            # Wait 5 seconds longer than the expected alarm to give enough +            # time for the normal sequence of events to occur.  This is +            # just a stop-gap to prevent the test from hanging. +            time.sleep(MAX_DURATION + 5) +            for i in range(3): +                os.kill(pid, signal.SIGALARM) +        finally: +            os._exit(0) +    # In parent (or error) +    return fork_pid +  try:      os.system(script) +    # Try to ensure this test exits even if there is some problem with alarm. +    # Tru64/Alpha sometimes hangs and is ultimately killed by the buildbot. +    fork_pid = force_test_exit()      print "starting pause() loop..."      try: @@ -94,6 +120,16 @@ try:          if verbose:              print "KeyboardInterrupt (assume the alarm() went off)" +    # Forcibly kill the child we created to ping us if there was a test error. +    try: +        # Make sure we don't kill ourself if there was a fork error. +        if fork_pid > 0: +            os.kill(fork_pid, signal.SIGKILL) +    except: +        # If the child killed us, it has probably exited.  Killing a +        # non-existant process will raise an error which we don't care about. +        pass +      if not a_called:          print 'HandlerA not called'  | 
