stats: track if the stats have been enabled and prevent requesting master id

Track the point in the initialization where statistics have been registered.
After this point registering new masterIds can no longer work as some
SimObjects may have sized stats vectors based on the previous value. If someone
tries to register a masterId after this point the simulator executes fatal().
This commit is contained in:
Ali Saidi 2012-05-10 18:04:26 -05:00
parent f6895e8bd4
commit 413ba1fdaf
5 changed files with 27 additions and 3 deletions

View file

@ -441,6 +441,23 @@ registerResetCallback(Callback *cb)
resetQueue.add(cb);
}
bool _enabled = false;
bool
enabled()
{
return _enabled;
}
void
enable()
{
if (_enabled)
fatal("Stats are already enabled");
_enabled = true;
}
} // namespace Stats
void

View file

@ -3126,6 +3126,8 @@ sum(Temp val)
/** Dump all statistics data to the registered outputs */
void dump();
void reset();
void enable();
bool enabled();
/**
* Register a callback that should be called whenever statistics are

View file

@ -82,6 +82,8 @@ def enable():
stats_dict[stat.name] = stat
stat.enable()
internal.stats.enable();
def prepare():
'''Prepare all stats for data access. This must be done before
dumping and serialization.'''

View file

@ -146,6 +146,8 @@ void schedStatEvent(bool dump, bool reset,
Tick when = curTick(), Tick repeat = 0);
void processResetQueue();
void enable();
bool enabled();
std::list<Info *> &statsList();

View file

@ -410,10 +410,11 @@ System::getMasterId(std::string master_name)
}
}
// todo: Check if stats are enabled yet
// I just don't know a good way to do it
// Verify that the statistics haven't been enabled yet
// Otherwise objects will have sized their stat buckets and
// they will be too small
if (false)
if (Stats::enabled())
fatal("Can't request a masterId after regStats(). \
You must do so in init().\n");