harness: Kill console lockprocess if wait() hangs for more than 5 seconds
[barrelfish] / tools / harness / subprocess_timeout.py
1 ##########################################################################
2 # Copyright (c) 2009-2016 ETH Zurich.
3 # All rights reserved.
4 #
5 # This file is distributed under the terms in the attached LICENSE file.
6 # If you do not find this file, copies can be found by writing to:
7 # ETH Zurich D-INFK, Universitaetstr 6, CH-8092 Zurich. Attn: Systems Group.
8 ##########################################################################
9
10 from threading import Timer
11
12 # Wait for Popen instance p for timeout seconds and terminate/kill it after
13 # the timeout expires
14 # Adapted from
15 # http://stackoverflow.com/questions/1191374/using-module-subprocess-with-timeout
16 def wait_or_terminate(p, timeout=5):
17
18     # Kill process if terminate doesn't exit in 1 second
19     def cleanup(x):
20         k = lambda y: y.kill()
21         timer2 = Timer(1, k, [x])
22         try:
23             timer2.start()
24             x.terminate()
25         finally:
26             timer2.cancel()
27
28     # Termiate process if it doesn't voluntarily exit in `timeout` seconds
29     timer = Timer(timeout, cleanup, [p])
30     try:
31         timer.start()
32         p.wait()
33     finally:
34         timer.cancel()