From fdc3b47067d1375cab9b3055eff7e0e1fec055cb Mon Sep 17 00:00:00 2001 From: Thomas Nagy Date: Thu, 25 Aug 2016 07:48:14 +0200 Subject: [PATCH] Python3 - Kill processes in subprocess timeouts #1807 --- waflib/Utils.py | 18 ++++++++++++++++-- waflib/processor.py | 12 +++++++++++- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/waflib/Utils.py b/waflib/Utils.py index 04ce8d05..f99dae23 100644 --- a/waflib/Utils.py +++ b/waflib/Utils.py @@ -24,6 +24,12 @@ if os.name == 'posix' and sys.version_info[0] < 3: else: import subprocess +try: + TimeoutExpired = subprocess.TimeoutExpired +except AttributeError: + class TimeoutExpired(object): + pass + from collections import deque, defaultdict try: @@ -856,11 +862,19 @@ def run_regular_process(cmd, kwargs, cargs={}): """ proc = subprocess.Popen(cmd, **kwargs) if kwargs.get('stdout') or kwargs.get('stderr'): - out, err = proc.communicate(**cargs) + try: + out, err = proc.communicate(**cargs) + except TimeoutExpired: + proc.kill() + out, err = proc.communicate(**cargs) status = proc.returncode else: out, err = (None, None) - status = proc.wait(**cargs) + try: + status = proc.wait(**cargs) + except TimeoutExpired: + proc.kill() + status = proc.wait(**cargs) return status, out, err def run_process(cmd, kwargs, cargs={}): diff --git a/waflib/processor.py b/waflib/processor.py index b023ae9d..3b1b87fa 100755 --- a/waflib/processor.py +++ b/waflib/processor.py @@ -13,6 +13,12 @@ try: except ImportError: import subprocess +try: + TimeoutExpired = subprocess.TimeoutExpired +except AttributeError: + class TimeoutExpired(object): + pass + def run(): txt = sys.stdin.readline().strip() if not txt: @@ -25,7 +31,11 @@ def run(): out, err, ex, trace = (None, None, None, None) try: proc = subprocess.Popen(cmd, **kwargs) - out, err = proc.communicate(**cargs) + try: + out, err = proc.communicate(**cargs) + except TimeoutExpired: + proc.kill() + out, err = proc.communicate(**cargs) ret = proc.returncode except (OSError, ValueError, Exception) as e: exc_type, exc_value, tb = sys.exc_info()