From f3a173b7369cbf5807dbc8b8c7d08189debb471f Mon Sep 17 00:00:00 2001 From: Kyle Altendorf Date: Fri, 5 Oct 2018 00:05:46 -0400 Subject: [PATCH] Revert "Use signal.alarm() for py2 timeout" This reverts commit 900cef639710682c67a4ab88bd9e7666b14a9da2. --- src/_pytest/pytester.py | 35 ++++++++++++++--------------------- 1 file changed, 14 insertions(+), 21 deletions(-) diff --git a/src/_pytest/pytester.py b/src/_pytest/pytester.py index d519162b1..a20c281e1 100644 --- a/src/_pytest/pytester.py +++ b/src/_pytest/pytester.py @@ -2,13 +2,11 @@ from __future__ import absolute_import, division, print_function import codecs -import contextlib import gc import os import platform import re import subprocess -import signal import six import sys import time @@ -1085,21 +1083,6 @@ class Testdir(object): popen.wait() raise self.TimeoutExpired(timeout_message) - @contextlib.contextmanager - def timeout_manager(handler, timeout): - original_handler = signal.getsignal(signal.SIGALRM) - if original_handler != signal.SIG_DFL: - # TODO: use an informative exception - raise Exception() - - signal.signal(signal.SIGALRM, handler) - signal.alarm(timeout) - - yield - - signal.alarm(0) - signal.signal(signal.SIGALRM, original_handler) - if timeout is None: ret = popen.wait() elif six.PY3: @@ -1108,10 +1091,20 @@ class Testdir(object): except subprocess.TimeoutExpired: handle_timeout() else: - with timeout_manager( - handler=lambda _1, _2: handle_timeout(), timeout=timeout - ): - ret = popen.wait() + end = time.time() + timeout + + resolution = min(0.1, timeout / 10) + + while True: + ret = popen.poll() + if ret is not None: + break + + remaining = end - time.time() + if remaining <= 0: + handle_timeout() + + time.sleep(resolution) finally: f1.close() f2.close()