stats: disallow duplicate statistic names.
authorNathan Binkert <nate@binkert.org>
Thu, 9 Apr 2009 05:22:50 +0000 (22:22 -0700)
committerNathan Binkert <nate@binkert.org>
Thu, 9 Apr 2009 05:22:50 +0000 (22:22 -0700)
src/base/statistics.cc
src/base/statistics.hh

index 0a59248e7aec53e5dae7f55ef11c95368ee62132..1f35623845a0115ae3664c7371df7d5dddbde6b9 100644 (file)
@@ -32,7 +32,6 @@
 #include <fstream>
 #include <list>
 #include <map>
-#include <set>
 #include <string>
 
 #include "base/callback.hh"
@@ -114,6 +113,14 @@ StorageParams::~StorageParams()
 {
 }
 
+typedef map<std::string, Info *> NameMapType;
+NameMapType &
+nameMap()
+{
+    static NameMapType the_map;
+    return the_map;
+}
+
 int Info::id_count = 0;
 
 int debug_break_id = -1;
@@ -130,6 +137,24 @@ Info::~Info()
 {
 }
 
+void
+Info::setName(const string &name)
+{
+    pair<NameMapType::iterator, bool> p =
+        nameMap().insert(make_pair(name, this));
+
+    Info *other = p.first->second;
+    bool result = p.second;
+    
+    if (!result) {
+        // using other->name instead of just name to avoid a compiler
+        // warning.  They should be the same.
+        panic("same statistic name used twice! name=%s\n", other->name);
+    }
+
+    this->name = name;
+}
+
 bool
 Info::less(Info *stat1, Info *stat2)
 {
index 88704207df27c194f262771417f1c2d88d392491..cd5be21ce6738a7d968d5c82b4e76ec70ee5372f 100644 (file)
@@ -114,6 +114,9 @@ class Info
     Info();
     virtual ~Info();
 
+    /** Set the name of this statistic */
+    void setName(const std::string &name);
+
     /**
      * Check that this stat has been set up properly and is ready for
      * use
@@ -402,10 +405,10 @@ class DataWrap : public InfoAccess
      * @return A reference to this stat.
      */
     Derived &
-    name(const std::string &_name)
+    name(const std::string &name)
     {
         Info *info = this->info();
-        info->name = _name;
+        info->setName(name);
         info->flags |= print;
         return this->self();
     }