aboutsummaryrefslogtreecommitdiffstats
path: root/experiment/executable/executable.py
diff options
context:
space:
mode:
authorJonathan Herman <hermanjl@cs.unc.edu>2012-09-16 20:46:19 -0400
committerJonathan Herman <hermanjl@cs.unc.edu>2012-09-16 20:46:19 -0400
commitbdb33621ac67b2cd9fadf3f3b006419ebb16a713 (patch)
tree8918b5dbc6db8a73c275e445153c7ea42857210b /experiment/executable/executable.py
parentfd92ecb5a642eeae6c54d3cca1508fc4c4cb6a87 (diff)
Created run_exps.py script.
Currently poorly documented.
Diffstat (limited to 'experiment/executable/executable.py')
-rw-r--r--experiment/executable/executable.py71
1 files changed, 71 insertions, 0 deletions
diff --git a/experiment/executable/executable.py b/experiment/executable/executable.py
new file mode 100644
index 0000000..6697a8d
--- /dev/null
+++ b/experiment/executable/executable.py
@@ -0,0 +1,71 @@
1import sys
2import subprocess
3import signal
4from ..litmus_util import is_executable
5
6class Executable(object):
7 """Parent object that represents an executable for use in task-sets."""
8
9 def __init__(self, exec_file, extra_args=None, stdout_file = None, stderr_file = None):
10 self.exec_file = exec_file
11 self.cwd = None
12 self.stdout_file = stdout_file
13 self.stderr_file = stderr_file
14 self.sp = None
15
16 if extra_args is None:
17 self.extra_args = None
18 else:
19 self.extra_args = list(extra_args) # make a duplicate
20
21 if not is_executable(self.exec_file):
22 raise Exception("Not executable ? : %s" % self.exec_file)
23
24 def __del__(self):
25 # Try and clean up
26 if self.stdout_file is not None:
27 self.stdout_file.close()
28 if self.stderr_file is not None:
29 self.stderr_file.close()
30
31 if self.sp is not None:
32 try:
33 self.sp.terminate()
34 except OSError as e:
35 if e.errno == 3:
36 pass # no such process (already killed), okay
37 else:
38 raise e
39
40 def __get_full_command(self):
41 full_command = [self.exec_file]
42 if self.extra_args is not None:
43 full_command += self.extra_args
44 return full_command
45
46 def execute(self):
47 """Execute the binary."""
48 full_command = self.__get_full_command()
49 self.sp = subprocess.Popen(full_command, stdout=self.stdout_file,
50 stderr=self.stderr_file, cwd=self.cwd)
51
52 def kill(self):
53 self.sp.kill()
54
55 def interrupt(self):
56 self.sp.send_signal(signal.SIGINT)
57
58 def terminate(self):
59 """Send the terminate signal to the binary."""
60 self.sp.terminate()
61
62 def wait(self):
63 """Wait until the executable is finished, checking return code.
64
65 If the exit status is non-zero, raise an exception.
66
67 """
68
69 self.sp.wait()
70 if self.sp.returncode != 0:
71 print >>sys.stderr, "Non-zero return: %s %s" % (self.exec_file, self.extra_args)