stats: Make Stats::Group::mergeStatGroup public
authorAndreas Sandberg <andreas.sandberg@arm.com>
Mon, 5 Oct 2020 14:13:06 +0000 (15:13 +0100)
committerAndreas Sandberg <andreas.sandberg@arm.com>
Thu, 8 Oct 2020 09:43:11 +0000 (09:43 +0000)
The stat system currently assumes that the decision to merge groups is
done at construction time. This makes it hard to implement global
statistics that live in a single global group.

This change adds some error checking to mergeStatGroup and marks it as
a public method.

Change-Id: I6a42f48545c5ccfcd0672bae66a5bc86bb042f13
Signed-off-by: Andreas Sandberg <andreas.sandberg@arm.com>
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/35615
Reviewed-by: Jason Lowe-Power <power.jg@gmail.com>
Maintainer: Jason Lowe-Power <power.jg@gmail.com>
Tested-by: kokoro <noreply+kokoro@google.com>
src/base/stats/group.cc
src/base/stats/group.hh

index a76ad4f319dbe95347a105302f2931557eccad92..f1eda1d6dc6cc2f70d800c03b936fb73e1ab298a 100644 (file)
@@ -47,7 +47,7 @@
 namespace Stats {
 
 Group::Group(Group *parent, const char *name)
-    : mergedParent(name ? nullptr : parent)
+    : mergedParent(nullptr)
 {
     if (parent && name) {
         parent->addStatGroup(name, this);
@@ -152,7 +152,22 @@ Group::resolveStat(std::string name) const
 void
 Group::mergeStatGroup(Group *block)
 {
+    panic_if(!block, "No stat block provided");
+    panic_if(block->mergedParent,
+             "Stat group already merged into another group");
+    panic_if(block == this, "Stat group can't merge with itself");
+
+    // Track the new stat group
     mergedStatGroups.push_back(block);
+
+    // We might not have seen stats that were associated with the
+    // child group before it was merged, so add them here.
+    for (auto &s : block->stats)
+        addStat(s);
+
+    // Setup the parent pointer so the child know that it needs to
+    // register new stats with the parent.
+    block->mergedParent = this;
 }
 
 const std::map<std::string, Group *> &
index 985bf61f60e820639343fc83d1cd6cc35e808682..ef223bce66804b20d97d1fc8b1e74e2eea44b396 100644 (file)
@@ -194,7 +194,6 @@ class Group
      */
     const Info * resolveStat(std::string name) const;
 
-  private:
     /**
      * Merge the contents (stats & children) of a block to this block.
      *
@@ -205,7 +204,7 @@ class Group
 
   private:
     /** Parent pointer if merged into parent */
-    Group *const mergedParent;
+    Group *mergedParent;
 
     std::map<std::string, Group *> statGroups;
     std::vector<Group *> mergedStatGroups;