summaryrefslogtreecommitdiff
path: root/rtemstoolkit/execute.py
diff options
context:
space:
mode:
authorChris Johns <chrisj@rtems.org>2014-05-31 20:03:05 +1000
committerChris Johns <chrisj@rtems.org>2014-05-31 20:03:05 +1000
commitc04a84917a82caa06b8efc4f24d3b60ed8f05d78 (patch)
treebe2073222f07b90c80216fdb105f02fb1fdc5c0d /rtemstoolkit/execute.py
parent5cdcde1ec2ccfa9dd88fadf55bbd18a220f2567f (diff)
tester: Correctly handle contro-c.
Add support to kill running tests if the user presses control-c.
Diffstat (limited to 'rtemstoolkit/execute.py')
-rwxr-xr-xrtemstoolkit/execute.py47
1 files changed, 46 insertions, 1 deletions
diff --git a/rtemstoolkit/execute.py b/rtemstoolkit/execute.py
index 1fc16d9..b1afc7c 100755
--- a/rtemstoolkit/execute.py
+++ b/rtemstoolkit/execute.py
@@ -116,6 +116,7 @@ class execute(object):
self.environment = None
self.outputting = False
self.timing_out = False
+ self.proc = None
def _capture(self, command, proc, timeout = None):
"""Create 3 threads to read stdout and stderr and send to the output handler
@@ -262,12 +263,25 @@ class execute(object):
timeout_thread.daemon = True
timeout_thread.start()
try:
+ self.lock.acquire()
+ try:
+ self.proc = proc
+ except:
+ raise
+ finally:
+ self.lock.release()
exitcode = proc.wait()
except:
- print 'killing'
proc.kill()
raise
finally:
+ self.lock.acquire()
+ try:
+ self.proc = None
+ except:
+ raise
+ finally:
+ self.lock.release()
if self.cleanup:
self.cleanup(proc)
if timeout_thread:
@@ -415,6 +429,37 @@ class execute(object):
self.environment = environment
return old_environment
+ def kill(self):
+ self.lock.acquire()
+ try:
+ if self.proc is not None:
+ self.proc.kill()
+ except:
+ raise
+ finally:
+ self.lock.release()
+
+ def terminate(self):
+ self.lock.acquire()
+ try:
+ if self.proc is not None:
+ self.proc.terminate()
+ except:
+ raise
+ finally:
+ self.lock.release()
+
+ def send_signal(self, signal):
+ self.lock.acquire()
+ try:
+ if self.proc is not None:
+ print "sending sig"
+ self.proc.send_signal(signal)
+ except:
+ raise
+ finally:
+ self.lock.release()
+
class capture_execution(execute):
"""Capture all output as a string and return it."""