diff options
-rw-r--r-- | base/statistics.cc | 34 | ||||
-rw-r--r-- | base/statistics.hh | 26 |
2 files changed, 37 insertions, 23 deletions
diff --git a/base/statistics.cc b/base/statistics.cc index cde98d861..184fa67a9 100644 --- a/base/statistics.cc +++ b/base/statistics.cc @@ -132,13 +132,13 @@ class Database typedef list<Stat *> list_t; typedef map<const Stat *, StatData *> map_t; - list<BinBase *> bins; - map<const BinBase *, std::string > bin_names; + list<GenBin *> bins; + map<const GenBin *, std::string > bin_names; list_t binnedStats; list_t allStats; list_t printStats; - map_t map; + map_t statMap; public: Database(); @@ -151,7 +151,7 @@ class Database void reset(); void regStat(Stat *stat); StatData *print(Stat *stat); - void regBin(BinBase *bin, std::string name); + void regBin(GenBin *bin, std::string name); }; Database::Database() @@ -173,14 +173,14 @@ Database::dump(ostream &stream) ++i; } - list<BinBase *>::iterator j = bins.begin(); - list<BinBase *>::iterator bins_end=bins.end(); + list<GenBin *>::iterator j = bins.begin(); + list<GenBin *>::iterator bins_end=bins.end(); if (!bins.empty()) { ccprintf(stream, "PRINTING BINNED STATS\n"); while (j != bins_end) { (*j)->activate(); - ::map<const BinBase *, std::string>::const_iterator iter; + map<const GenBin *, std::string>::const_iterator iter; iter = bin_names.find(*j); if (iter == bin_names.end()) panic("a binned stat not found in names map!"); @@ -213,9 +213,9 @@ Database::dump(ostream &stream) StatData * Database::find(const Stat *stat) { - map_t::const_iterator i = map.find(stat); + map_t::const_iterator i = statMap.find(stat); - if (i == map.end()) + if (i == statMap.end()) return NULL; return (*i).second; @@ -265,19 +265,19 @@ Database::reset() void Database::regStat(Stat *stat) { - if (map.find(stat) != map.end()) + if (statMap.find(stat) != statMap.end()) panic("shouldn't register stat twice!"); allStats.push_back(stat); StatData *data = new StatData; - bool success = (map.insert(make_pair(stat, data))).second; - assert(map.find(stat) != map.end()); + bool success = (statMap.insert(make_pair(stat, data))).second; + assert(statMap.find(stat) != statMap.end()); assert(success && "this should never fail"); } void -Database::regBin(BinBase *bin, std::string name) +Database::regBin(GenBin *bin, std::string name) { if (bin_names.find(bin) != bin_names.end()) panic("shouldn't register bin twice"); @@ -877,8 +877,8 @@ FancyDisplay(ostream &stream, const string &name, const string &desc, PrintOne(stream, stdev, name + NAMESEP + "stdev", desc, precision, flags); } -BinBase::BinBase(size_t size) - : memsize(CeilPow2(size)), mem(NULL) +BinBase::BinBase() + : mem(NULL), memsize(-1) { } @@ -900,9 +900,9 @@ BinBase::memory() } void -BinBase::regBin(BinBase *bin, std::string name) +GenBin::regBin(GenBin *bin, std::string name) { - StatDB().regBin(bin, name); + Detail::StatDB().regBin(bin, name); } } // namespace Detail diff --git a/base/statistics.hh b/base/statistics.hh index c789b07c0..2344b5df5 100644 --- a/base/statistics.hh +++ b/base/statistics.hh @@ -59,6 +59,8 @@ #include "sim/host.hh" +#include "base/cprintf.hh" + // // Un-comment this to enable weirdo-stat debugging // @@ -2145,24 +2147,32 @@ class Temp class BinBase { private: - off_t memsize; char *mem; protected: + off_t memsize; off_t size() const { return memsize; } char *memory(); public: - BinBase(size_t size); + BinBase(); virtual ~BinBase(); - virtual void activate() = 0; - void regBin(BinBase *bin, std::string name); }; } // namespace Detail +class GenBin : public Detail::BinBase +{ + public: + GenBin() : BinBase() {} + virtual ~GenBin() {}; + + virtual void activate() = 0; + void regBin(GenBin *bin, std::string name); +}; + template <class BinType> -struct StatBin : public Detail::BinBase +struct StatBin : public GenBin { private: std::string _name; @@ -2193,9 +2203,13 @@ struct StatBin : public Detail::BinBase return off; } - explicit StatBin(std::string name, size_t size = 1024) : Detail::BinBase(size) { _name = name; this->regBin(this, name); } + explicit StatBin(std::string name) : GenBin() { _name = name; this->regBin(this, name); } char *memory(off_t off) { + if (memsize == -1) { + memsize = CeilPow2((size_t) offset()); + cprintf("this is memsize: %d\n", (uint64_t) memsize); + } assert(offset() <= size()); return Detail::BinBase::memory() + off; } |