diff --git a/src/base/stats/group.cc b/src/base/stats/group.cc index a76ad4f319..f1eda1d6dc 100644 --- a/src/base/stats/group.cc +++ b/src/base/stats/group.cc @@ -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 & diff --git a/src/base/stats/group.hh b/src/base/stats/group.hh index 985bf61f60..ef223bce66 100644 --- a/src/base/stats/group.hh +++ b/src/base/stats/group.hh @@ -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 statGroups; std::vector mergedStatGroups;