summaryrefslogtreecommitdiff
path: root/rtemstoolkit
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
parent5cdcde1ec2ccfa9dd88fadf55bbd18a220f2567f (diff)
tester: Correctly handle contro-c.
Add support to kill running tests if the user presses control-c.
Diffstat (limited to 'rtemstoolkit')
-rwxr-xr-xrtemstoolkit/execute.py47
-rw-r--r--rtemstoolkit/stacktraces.py43
2 files changed, 89 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."""
diff --git a/rtemstoolkit/stacktraces.py b/rtemstoolkit/stacktraces.py
new file mode 100644
index 0000000..e589618
--- /dev/null
+++ b/rtemstoolkit/stacktraces.py
@@ -0,0 +1,43 @@
+#
+# RTEMS Tools Project (http://www.rtems.org/)
+# Copyright 2013-2014 Chris Johns (chrisj@rtems.org)
+# All rights reserved.
+#
+# This file is part of the RTEMS Tools package in 'rtems-tools'.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# 1. Redistributions of source code must retain the above copyright notice,
+# this list of conditions and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above copyright notice,
+# this list of conditions and the following disclaimer in the documentation
+# and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+
+import sys
+import traceback
+
+def trace():
+ code = []
+ for threadId, stack in sys._current_frames().items():
+ code.append("\n# thread-id: %s" % threadId)
+ for filename, lineno, name, line in traceback.extract_stack(stack):
+ code.append('file: "%s", line %d, in %s' % (filename, lineno, name))
+ if line:
+ code.append(" %s" % (line.strip()))
+ return '\n'.join(code)
+