summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Binkert <binkertn@umich.edu>2003-11-22 15:07:53 -0500
committerNathan Binkert <binkertn@umich.edu>2003-11-22 15:07:53 -0500
commitd1e12b57ce06990a0daf9c295c688795bf62f7cf (patch)
treecbc42c6e5efbef4688c7a87577d7c6e166afebf1
parent92348c503ce04a34f2ed5f871f55fae995a71111 (diff)
downloadgem5-d1e12b57ce06990a0daf9c295c688795bf62f7cf.tar.xz
We only need to choose that we do want binning, or we don't.
no need for multiple bin classes. If multiple bins are needed, we can always do it with ini type config instead. kern/tru64/tru64_events.hh: sim/system.cc: sim/system.hh: No more GenBin always use MainBin --HG-- extra : convert_revision : 8c466f302324c33b59d47d0da04583b2517fc72c
-rw-r--r--base/statistics.cc43
-rw-r--r--base/statistics.hh103
-rw-r--r--kern/tru64/tru64_events.hh2
-rw-r--r--sim/system.cc4
-rw-r--r--sim/system.hh4
5 files changed, 72 insertions, 84 deletions
diff --git a/base/statistics.cc b/base/statistics.cc
index b08715162..94b8852f8 100644
--- a/base/statistics.cc
+++ b/base/statistics.cc
@@ -129,8 +129,8 @@ class Database
typedef list<Stat *> list_t;
typedef map<const Stat *, StatData *> map_t;
- list<GenBin *> bins;
- map<const GenBin *, std::string > bin_names;
+ list<MainBin *> bins;
+ map<const MainBin *, std::string > bin_names;
list_t binnedStats;
list_t allStats;
@@ -148,7 +148,7 @@ class Database
void reset();
void regStat(Stat *stat);
StatData *print(Stat *stat);
- void regBin(GenBin *bin, std::string name);
+ void regBin(MainBin *bin, std::string name);
};
Database::Database()
@@ -171,14 +171,14 @@ Database::dump(ostream &stream)
}
#endif //FS_MEASURE
- list<GenBin *>::iterator j = bins.begin();
- list<GenBin *>::iterator bins_end=bins.end();
+ list<MainBin *>::iterator j = bins.begin();
+ list<MainBin *>::iterator bins_end=bins.end();
if (!bins.empty()) {
ccprintf(stream, "PRINTING BINNED STATS\n");
while (j != bins_end) {
(*j)->activate();
- map<const GenBin *, std::string>::const_iterator iter;
+ map<const MainBin *, std::string>::const_iterator iter;
iter = bin_names.find(*j);
if (iter == bin_names.end())
panic("a binned stat not found in names map!");
@@ -274,10 +274,10 @@ Database::reset()
MainBin *orig = MainBin::curBin();
- list<GenBin *>::iterator bi = bins.begin();
- list<GenBin *>::iterator be = bins.end();
+ list<MainBin *>::iterator bi = bins.begin();
+ list<MainBin *>::iterator be = bins.end();
while (bi != be) {
- GenBin *bin = *bi;
+ MainBin *bin = *bi;
bin->activate();
i = allStats.begin();
@@ -308,7 +308,7 @@ Database::regStat(Stat *stat)
}
void
-Database::regBin(GenBin *bin, std::string name)
+Database::regBin(MainBin *bin, std::string name)
{
if (bin_names.find(bin) != bin_names.end())
panic("shouldn't register bin twice");
@@ -910,36 +910,35 @@ FancyDisplay(ostream &stream, const string &name, const string &desc,
PrintOne(stream, total, "**Ignore: " + name + NAMESEP + "TOT", desc, precision, flags);
}
-BinBase::BinBase()
- : mem(NULL), memsize(-1)
+} // namespace Detail
+
+MainBin::MainBin(const std::string &name)
+ : _name(name), mem(NULL), memsize(-1)
{
+ Detail::StatDB().regBin(this, name);
}
-BinBase::~BinBase()
+MainBin::~MainBin()
{
if (mem)
delete [] mem;
}
char *
-BinBase::memory()
+MainBin::memory(off_t off)
{
if (!mem) {
mem = new char[memsize];
memset(mem, 0, memsize);
}
- return mem;
-}
+ if (memsize == -1)
+ memsize = CeilPow2((size_t) offset());
-void
-GenBin::regBin(GenBin *bin, std::string name)
-{
- Detail::StatDB().regBin(bin, name);
+ assert(offset() <= size());
+ return mem + off;
}
-} // namespace Detail
-
void
check()
{
diff --git a/base/statistics.hh b/base/statistics.hh
index 28c380602..e71380b90 100644
--- a/base/statistics.hh
+++ b/base/statistics.hh
@@ -2170,64 +2170,43 @@ class Temp
operator NodePtr() { return node;}
};
+} // namespace Detail
+
//////////////////////////////////////////////////////////////////////
//
// Binning Interface
//
//////////////////////////////////////////////////////////////////////
-
-class BinBase
+struct MainBin
{
private:
+ std::string _name;
char *mem;
protected:
off_t memsize;
off_t size() const { return memsize; }
- char *memory();
-
- public:
- BinBase();
- virtual ~BinBase();
-};
+ char *memory(off_t off);
-} // namespace Detail
-
-class GenBin : public Detail::BinBase
-{
public:
- GenBin() : BinBase() {}
- virtual ~GenBin() {};
-
- virtual void activate() = 0;
- virtual std::string name() const = 0;
- void regBin(GenBin *bin, std::string name);
-};
-
-template <class BinType>
-struct StatBin : public GenBin
-{
- private:
- std::string _name;
-
- public:
- std::string name() const { return _name;}
-
- static StatBin *&curBin() {
- static StatBin *current = NULL;
+ static MainBin *&curBin()
+ {
+ static MainBin *current = NULL;
return current;
}
- static void setCurBin(StatBin *bin) { curBin() = bin; }
- static StatBin *current() { assert(curBin()); return curBin(); }
+ static void setCurBin(MainBin *bin) { curBin() = bin; }
+ static MainBin *current() { assert(curBin()); return curBin(); }
- static off_t &offset() {
+ static off_t &offset()
+ {
static off_t offset = 0;
return offset;
}
- static off_t new_offset(size_t size) {
+ static off_t new_offset(size_t size)
+ {
size_t mask = sizeof(u_int64_t) - 1;
off_t off = offset();
@@ -2236,23 +2215,24 @@ struct StatBin : public GenBin
return off;
}
- explicit StatBin(std::string name) : GenBin() { _name = name; this->regBin(this, name); }
+ public:
+ MainBin(const std::string &name);
+ ~MainBin();
- char *memory(off_t off) {
- if (memsize == -1) {
- memsize = CeilPow2((size_t) offset());
- }
- assert(offset() <= size());
- return Detail::BinBase::memory() + off;
+ const std::string &
+ name() const
+ {
+ return _name;
}
- virtual void activate() {
+ void
+ activate()
+ {
setCurBin(this);
#ifdef FS_MEASURE
DPRINTF(TCPIP, "activating %s Bin\n", name());
#endif
}
- static void activate(StatBin &bin) { setCurBin(&bin); }
class BinBase
{
@@ -2261,10 +2241,12 @@ struct StatBin : public GenBin
public:
BinBase() : offset(-1) {}
- void allocate(size_t size) {
+ void allocate(size_t size)
+ {
offset = new_offset(size);
}
- char *access() {
+ char *access()
+ {
assert(offset != -1);
return current()->memory(offset);
}
@@ -2284,7 +2266,9 @@ struct StatBin : public GenBin
int size() const { return 1; }
- Storage *data(Params &params) {
+ Storage *
+ data(Params &params)
+ {
assert(initialized());
char *ptr = access();
char *flags = ptr + sizeof(Storage);
@@ -2294,7 +2278,9 @@ struct StatBin : public GenBin
}
return reinterpret_cast<Storage *>(ptr);
}
- void reset()
+
+ void
+ reset()
{
char *ptr = access();
char *flags = ptr + size() * sizeof(Storage);
@@ -2320,7 +2306,8 @@ struct StatBin : public GenBin
VectorBin() : _size(0) {}
bool initialized() const { return _size > 0; }
- void init(int s, Params &params) {
+ void init(int s, Params &params)
+ {
assert(!initialized());
assert(s > 0);
_size = s;
@@ -2329,7 +2316,8 @@ struct StatBin : public GenBin
int size() const { return _size; }
- Storage *data(int index, Params &params) {
+ Storage *data(int index, Params &params)
+ {
assert(initialized());
assert(index >= 0 && index < size());
char *ptr = access();
@@ -2357,9 +2345,6 @@ struct StatBin : public GenBin
};
};
-class MainBinType {};
-typedef StatBin<MainBinType> MainBin;
-
struct NoBin
{
template <class Storage>
@@ -2379,11 +2364,13 @@ struct NoBin
}
bool initialized() const { return true; }
- void init(Params &params) {
+ void init(Params &params)
+ {
new (ptr) Storage(params);
}
int size() const{ return 1; }
- Storage *data(Params &params) {
+ Storage *data(Params &params)
+ {
assert(initialized());
return reinterpret_cast<Storage *>(ptr);
}
@@ -2420,7 +2407,8 @@ struct NoBin
}
bool initialized() const { return ptr != NULL; }
- void init(int s, Params &params) {
+ void init(int s, Params &params)
+ {
assert(s > 0 && "size must be positive!");
assert(!initialized());
_size = s;
@@ -2431,7 +2419,8 @@ struct NoBin
int size() const { return _size; }
- Storage *data(int index, Params &params) {
+ Storage *data(int index, Params &params)
+ {
assert(initialized());
assert(index >= 0 && index < size());
return reinterpret_cast<Storage *>(ptr + index * sizeof(Storage));
diff --git a/kern/tru64/tru64_events.hh b/kern/tru64/tru64_events.hh
index a8f0eb865..2067f2ef3 100644
--- a/kern/tru64/tru64_events.hh
+++ b/kern/tru64/tru64_events.hh
@@ -92,7 +92,7 @@ class FnEvent : public PCEvent
private:
std::string _name;
- Statistics::GenBin *myBin;
+ Statistics::MainBin *myBin;
};
#endif //FS_MEASURE
#endif // __TRU64_EVENTS_HH__
diff --git a/sim/system.cc b/sim/system.cc
index 58e290d1a..db93250ee 100644
--- a/sim/system.cc
+++ b/sim/system.cc
@@ -105,10 +105,10 @@ printSystems()
}
#ifdef FS_MEASURE
-Statistics::GenBin *
+Statistics::MainBin *
System::getBin(const std::string &name)
{
- std::map<const std::string, Statistics::GenBin *>::const_iterator i;
+ std::map<const std::string, Statistics::MainBin *>::const_iterator i;
i = fnBins.find(name);
if (i == fnBins.end())
panic("trying to getBin that is not on system map!");
diff --git a/sim/system.hh b/sim/system.hh
index 741dea0db..8348a144e 100644
--- a/sim/system.hh
+++ b/sim/system.hh
@@ -52,7 +52,7 @@ class System : public SimObject
{
#ifdef FS_MEASURE
protected:
- std::map<const std::string, Statistics::GenBin *> fnBins;
+ std::map<const std::string, Statistics::MainBin *> fnBins;
std::map<const Addr, SWContext *> swCtxMap;
#endif //FS_MEASURE
@@ -85,7 +85,7 @@ class System : public SimObject
virtual bool breakpoint() = 0;
#ifdef FS_MEASURE
- Statistics::GenBin * getBin(const std::string &name);
+ Statistics::MainBin * getBin(const std::string &name);
virtual bool findCaller(std::string, std::string) const = 0;
SWContext *findContext(Addr pcb);