From 680f46b2d51db66ac5028a6a8df7cdf82958bb54 Mon Sep 17 00:00:00 2001
From: Florian Fischer <florian.fl.fischer@fau.de>
Date: Sun, 28 Apr 2019 22:52:52 +0200
Subject: [PATCH] use special allocator "malt" during analyse to run the
 benchmark only once

---
 bench.py         | 41 +++++++++++++++++++++++++++++++----------
 src/benchmark.py | 10 ++++------
 2 files changed, 35 insertions(+), 16 deletions(-)

diff --git a/bench.py b/bench.py
index eef861a..023614e 100755
--- a/bench.py
+++ b/bench.py
@@ -36,15 +36,17 @@ parser.add_argument("--license", help="print license info and exit", action='sto
 
 """Run tasks on exit"""
 def epilog():
-    if os.listdir(src.globalvars.resdir) == []:
-        print_warn("Remove empty resultdir")
-        os.removedirs(src.globalvars.resdir)
-    else:
-        endtime = datetime.datetime.now().isoformat()
-        endtime = endtime[:endtime.rfind(':')]
-        src.globalvars.facts["endtime"] = endtime
-        with open(os.path.join(src.globalvars.resdir, "facts.save"), "wb") as f:
-            pickle.dump(src.globalvars.facts, f)
+    # After early errors resdir may not be set
+    if src.globalvars.resdir != None:
+        if os.listdir(src.globalvars.resdir) == []:
+            print_warn("Remove empty resultdir")
+            os.removedirs(src.globalvars.resdir)
+        else:
+            endtime = datetime.datetime.now().isoformat()
+            endtime = endtime[:endtime.rfind(':')]
+            src.globalvars.facts["endtime"] = endtime
+            with open(os.path.join(src.globalvars.resdir, "facts.save"), "wb") as f:
+                pickle.dump(src.globalvars.facts, f)
 
 def main():
     args = parser.parse_args()
@@ -162,9 +164,28 @@ def main():
                 if find_cmd("malt") is not None:
                     print_status("Analysing {} ...".format(bench))
 
+
                     malt_cmd = "malt -o output:name={}/malt.{}.%3"
                     malt_cmd = malt_cmd.format(bench_res_dir, "{perm}")
-                    bench.run(runs=1, dry_run=True, cmd_prefix=malt_cmd)
+
+                    old_allocs = bench.allocators
+                    # use malt as allocator
+                    src.globalvars.allocators = {"malt": {"cmd_prefix"    : malt_cmd,
+                                                          "binary_suffix" : "",
+                                                          "LD_PRELOAD"    : ""}}
+                    try:
+                        bench.run(runs=1)
+                    except Exception:
+                        print_error(traceback.format_exc())
+                        print_error("Skipping analysis of", bench, "!")
+
+                    if "malt" in bench.results:
+                        del(bench.results["malt"])
+                    if "malt" in bench.results["stats"]
+                        del(bench.results["stats"]["malt"])
+                    # restore allocs
+                    bench.allocators = old_allocs
+
                 else:
                     print_error("malt not found. Skipping analyse.")
 
diff --git a/src/benchmark.py b/src/benchmark.py
index 4bab146..4737799 100644
--- a/src/benchmark.py
+++ b/src/benchmark.py
@@ -168,7 +168,7 @@ class Benchmark (object):
             if is_fixed:
                 yield p
 
-    def run(self, runs=5, dry_run=False, cmd_prefix=""):
+    def run(self, runs=5):
         if runs < 1:
             return
 
@@ -238,7 +238,6 @@ class Benchmark (object):
 
                         actual_cmd = "{} {} {} {}{}".format(self.measure_cmd,
                                                             t["cmd_prefix"],
-                                                            cmd_prefix,
                                                             binary,
                                                             actual_cmd[cmd_start:])
                         # substitute again
@@ -297,10 +296,9 @@ class Benchmark (object):
                         if valid_result != None:
                             valid_result = result
 
-                    if not dry_run:
-                        if not perm in self.results[alloc_name]:
-                            self.results[alloc_name][perm] = []
-                        self.results[alloc_name][perm].append(result)
+                    if not perm in self.results[alloc_name]:
+                        self.results[alloc_name][perm] = []
+                    self.results[alloc_name][perm].append(result)
 
                 if hasattr(self, "postallocator_hook"):
                     self.postallocator_hook((alloc_name, t), run,
-- 
GitLab