diff options
author | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-04-22 15:32:12 -0400 |
---|---|---|
committer | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-04-22 15:32:12 -0400 |
commit | 25ccdb0cbc6b959b1f96c89b8bce91963cb67b4c (patch) | |
tree | dcaeb7d85f3dcc0f2afbb53d11c512c71fb712ab /run/litmus_util.py | |
parent | fbd1df6f63eb551b99f71330d2370c570ff323f5 (diff) |
Improved robustness of run_exps.py execution.
Thanks to bcw and gelliott for debugging and ideas.
* Print out experiment number and total experiments when starting experiments.
* Only sleep and re-release tasks if tasks are waiting to release.
* Fail experiment with verbose messages if any tasks fail before becoming ready
to release.
* When waiting for tasks to become ready for release, reset the waiting time
whenever a new task (or task(s)) become ready.
* Start regular tracers BEFORE the plugin switch to log data from the switch.
* Check the number of running tasks AFTER trying to switch the linux scheduler.
This gives plugin deactivate code the opportunity to kill these tasks.
* If an invalid executable is specified in the schedule file, fail before
attempting to run the experiment and print out the problem.
* Propogate exceptions up from experiment failures instead of creating
ExperimentFailed exceptions.
This commit also made clock-frequency automatically ignored by parse_exps.py.
The value of this would change by +- a Mhz between experiments, ruining graphs.
Diffstat (limited to 'run/litmus_util.py')
-rw-r--r-- | run/litmus_util.py | 13 |
1 files changed, 5 insertions, 8 deletions
diff --git a/run/litmus_util.py b/run/litmus_util.py index 70da262..81f690b 100644 --- a/run/litmus_util.py +++ b/run/litmus_util.py | |||
@@ -20,7 +20,7 @@ def switch_scheduler(switch_to_in): | |||
20 | with open('/proc/litmus/active_plugin', 'w') as active_plugin: | 20 | with open('/proc/litmus/active_plugin', 'w') as active_plugin: |
21 | subprocess.Popen(["echo", switch_to], stdout=active_plugin) | 21 | subprocess.Popen(["echo", switch_to], stdout=active_plugin) |
22 | 22 | ||
23 | # it takes a bit to do the switch, sleep an arbitrary amount of time | 23 | # It takes a bit to do the switch, sleep an arbitrary amount of time |
24 | time.sleep(2) | 24 | time.sleep(2) |
25 | 25 | ||
26 | cur_plugin = scheduler() | 26 | cur_plugin = scheduler() |
@@ -29,24 +29,21 @@ def switch_scheduler(switch_to_in): | |||
29 | (switch_to, cur_plugin)) | 29 | (switch_to, cur_plugin)) |
30 | 30 | ||
31 | def waiting_tasks(): | 31 | def waiting_tasks(): |
32 | reg = re.compile(r'^ready.*?(?P<READY>\d+)$', re.M) | 32 | reg = re.compile(r'^ready.*?(?P<WAITING>\d+)$', re.M) |
33 | with open('/proc/litmus/stats', 'r') as f: | 33 | with open('/proc/litmus/stats', 'r') as f: |
34 | data = f.read() | 34 | data = f.read() |
35 | 35 | ||
36 | # Ignore if no tasks are waiting for release | 36 | # Ignore if no tasks are waiting for release |
37 | match = re.search(reg, data) | 37 | waiting = re.search(reg, data).group("WAITING") |
38 | ready = match.group("READY") | ||
39 | 38 | ||
40 | return 0 if not ready else int(ready) | 39 | return 0 if not waiting else int(waiting) |
41 | 40 | ||
42 | def all_tasks(): | 41 | def all_tasks(): |
43 | reg = re.compile(r'^real-time.*?(?P<TASKS>\d+)$', re.M) | 42 | reg = re.compile(r'^real-time.*?(?P<TASKS>\d+)$', re.M) |
44 | with open('/proc/litmus/stats', 'r') as f: | 43 | with open('/proc/litmus/stats', 'r') as f: |
45 | data = f.read() | 44 | data = f.read() |
46 | 45 | ||
47 | # Ignore if no tasks are waiting for release | 46 | ready = re.search(reg, data).group("TASKS") |
48 | match = re.search(reg, data) | ||
49 | ready = match.group("TASKS") | ||
50 | 47 | ||
51 | return 0 if not ready else int(ready) | 48 | return 0 if not ready else int(ready) |
52 | 49 | ||