stats: disallow duplicate statistic names.

This commit is contained in:
Nathan Binkert 2009-04-08 22:22:50 -07:00
parent 18a30524d6
commit c87c9950df
2 changed files with 31 additions and 3 deletions

View 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)
{

View 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();
}