stats: Add a preDumpStats() callback to Stats::Group
authorAndreas Sandberg <andreas.sandberg@arm.com>
Tue, 24 Sep 2019 09:41:17 +0000 (10:41 +0100)
committerAndreas Sandberg <andreas.sandberg@arm.com>
Thu, 26 Sep 2019 10:05:03 +0000 (10:05 +0000)
Some objects need to know that we are about to dump stats to perform
prepare statistics. This is currently done by registering a callback
with the stat system. Expose this callback as a virtual method
in Stats::Group to make this pattern more convenient.

Change-Id: I5aa475b7d04c288e45f5f413ab7a1907b971dae5
Signed-off-by: Andreas Sandberg <andreas.sandberg@arm.com>
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/21139
Tested-by: kokoro <noreply+kokoro@google.com>
Reviewed-by: Daniel Carvalho <odanrc@yahoo.com.br>
src/base/stats/group.cc
src/base/stats/group.hh
src/python/m5/stats/__init__.py
src/python/pybind11/stats.cc

index b1504275a6e7926eb6ee67d8fb5b91288c86be2f..d7c244225e21629e0f2d3d189b416ea3094302dd 100644 (file)
@@ -93,6 +93,16 @@ Group::resetStats()
         g.second->resetStats();
 }
 
+void
+Group::preDumpStats()
+{
+    for (auto &g : mergedStatGroups)
+        g->preDumpStats();
+
+    for (auto &g : statGroups)
+        g.second->preDumpStats();
+}
+
 void
 Group::addStat(Stats::Info *info)
 {
index f65e46448c3ead36ab4f37d8e4febdc51abb4962..96743a811b0ffbb74dc7d1d2bbeb0e2e72a8eac9 100644 (file)
@@ -127,6 +127,13 @@ class Group
      */
     virtual void resetStats();
 
+    /**
+     * Callback before stats are dumped. This can be overridden by
+     * objects that need to perform calculations in addition to the
+     * capabiltiies implemented in the stat framework.
+     */
+    virtual void preDumpStats();
+
     /**
      * Register a stat with this group. This method is normally called
      * automatically when a stat is instantiated.
index e2e1909f7ea034bf4294c900ccb89f1e7d113236..6a7c14d00ff2f0dfd8b4f8899f69c8b223916a60 100644 (file)
@@ -371,6 +371,10 @@ def dump(root=None):
     # Only prepare stats the first time we dump them in the same tick.
     if new_dump:
         _m5.stats.processDumpQueue()
+        # Notify new-style stats group that we are about to dump stats.
+        sim_root = Root.getInstance()
+        if sim_root:
+            sim_root.preDumpStats();
         prepare()
 
     for output in outputList:
index 190c78d52d4e323a8b9a779a0d63de95ba750fc4..b1f4209782a8bb3a39b389ba5c1e86716c5c57ae 100644 (file)
@@ -127,6 +127,7 @@ pybind_init_stats(py::module &m_native)
         m, "Group")
         .def("regStats", &Stats::Group::regStats)
         .def("resetStats", &Stats::Group::resetStats)
+        .def("preDumpStats", &Stats::Group::preDumpStats)
         .def("getStats", &Stats::Group::getStats)
         .def("getStatGroups", &Stats::Group::getStatGroups)
         .def("addStatGroup", &Stats::Group::addStatGroup)