stats: get rid of the convoluted 'database' code.

Just use the stuff directly and things ought to be more clear
This commit is contained in:
Nathan Binkert 2009-02-23 12:22:17 -08:00
parent fb74987c52
commit 80d5f34da6
7 changed files with 47 additions and 193 deletions

View file

@ -74,7 +74,6 @@ Source('loader/symtab.cc')
Source('stats/events.cc') Source('stats/events.cc')
Source('stats/output.cc') Source('stats/output.cc')
Source('stats/statdb.cc')
Source('stats/text.cc') Source('stats/text.cc')
Source('stats/visit.cc') Source('stats/visit.cc')

View file

@ -42,28 +42,42 @@
#include "base/str.hh" #include "base/str.hh"
#include "base/time.hh" #include "base/time.hh"
#include "base/trace.hh" #include "base/trace.hh"
#include "base/stats/statdb.hh"
using namespace std; using namespace std;
namespace Stats { namespace Stats {
Info * typedef map<const void *, Info *> MapType;
InfoAccess::find() const
// We wrap these in a function to make sure they're built in time.
list<Info *> &
statsList()
{ {
return Database::find(const_cast<void *>((const void *)this)); static list<Info *> the_list;
return the_list;
} }
const Info * MapType &
getInfo(const void *stat) statsMap()
{ {
return Database::find(const_cast<void *>(stat)); static MapType the_map;
return the_map;
} }
void void
InfoAccess::setInfo(Info *info) InfoAccess::setInfo(Info *info)
{ {
Database::regStat(this, info); if (statsMap().find(this) != statsMap().end())
panic("shouldn't register stat twice!");
statsList().push_back(info);
#ifndef NDEBUG
pair<MapType::iterator, bool> result =
#endif
statsMap().insert(make_pair(this, info));
assert(result.second && "this should never fail");
assert(statsMap().find(this) != statsMap().end());
} }
void void
@ -75,17 +89,17 @@ InfoAccess::setInit()
Info * Info *
InfoAccess::info() InfoAccess::info()
{ {
Info *info = find(); MapType::const_iterator i = statsMap().find(this);
assert(info); assert(i != statsMap().end());
return info; return (*i).second;
} }
const Info * const Info *
InfoAccess::info() const InfoAccess::info() const
{ {
const Info *info = find(); MapType::const_iterator i = statsMap().find(this);
assert(info); assert(i != statsMap().end());
return info; return (*i).second;
} }
Info::Info() Info::Info()
@ -228,10 +242,10 @@ Formula::operator+=(Temp r)
void void
check() check()
{ {
typedef Database::stat_list_t::iterator iter_t; typedef list<Info *>::iterator iter_t;
iter_t i, end = Database::stats().end(); iter_t i, end = statsList().end();
for (i = Database::stats().begin(); i != end; ++i) { for (i = statsList().begin(); i != end; ++i) {
Info *info = *i; Info *info = *i;
assert(info); assert(info);
if (!info->check() || !info->baseCheck()) if (!info->check() || !info->baseCheck())
@ -239,13 +253,13 @@ check()
} }
off_t j = 0; off_t j = 0;
for (i = Database::stats().begin(); i != end; ++i) { for (i = statsList().begin(); i != end; ++i) {
Info *info = *i; Info *info = *i;
if (!(info->flags & print)) if (!(info->flags & print))
info->name = "__Stat" + to_string(j++); info->name = "__Stat" + to_string(j++);
} }
Database::stats().sort(Info::less); statsList().sort(Info::less);
if (i == end) if (i == end)
return; return;
@ -253,7 +267,7 @@ check()
iter_t last = i; iter_t last = i;
++i; ++i;
for (i = Database::stats().begin(); i != end; ++i) { for (i = statsList().begin(); i != end; ++i) {
if ((*i)->name == (*last)->name) if ((*i)->name == (*last)->name)
panic("same name used twice! name=%s\n", (*i)->name); panic("same name used twice! name=%s\n", (*i)->name);
@ -266,8 +280,8 @@ CallbackQueue resetQueue;
void void
reset() reset()
{ {
Database::stat_list_t::iterator i = Database::stats().begin(); list<Info *>::iterator i = statsList().begin();
Database::stat_list_t::iterator end = Database::stats().end(); list<Info *>::iterator end = statsList().end();
while (i != end) { while (i != end) {
Info *info = *i; Info *info = *i;
info->reset(); info->reset();

View file

@ -56,6 +56,7 @@
#include <functional> #include <functional>
#include <iosfwd> #include <iosfwd>
#include <limits> #include <limits>
#include <list>
#include <string> #include <string>
#include <vector> #include <vector>
@ -382,7 +383,6 @@ class Vector2dInfo : public Vector2dInfoBase
class InfoAccess class InfoAccess
{ {
protected: protected:
Info *find() const;
/** Set up an info class for this statistic */ /** Set up an info class for this statistic */
void setInfo(Info *info); void setInfo(Info *info);
/** Save Storage class parameters if any */ /** Save Storage class parameters if any */
@ -1339,7 +1339,7 @@ class Vector2dBase : public InfoAccess
assert(_x > 0 && _y > 0 && "sizes must be positive!"); assert(_x > 0 && _y > 0 && "sizes must be positive!");
assert(!storage && "already initialized"); assert(!storage && "already initialized");
Vector2dInfoBase *info = dynamic_cast<Vector2dInfoBase *>(find()); Vector2dInfoBase *info = safe_cast<Vector2dInfoBase *>(this->info());
x = _x; x = _x;
y = _y; y = _y;
@ -3084,6 +3084,8 @@ sum(Temp val)
return NodePtr(new SumNode<std::plus<Result> >(val)); return NodePtr(new SumNode<std::plus<Result> >(val));
} }
std::list<Info *> &statsList();
/* namespace Stats */ } /* namespace Stats */ }
#endif // __BASE_STATISTICS_HH__ #endif // __BASE_STATISTICS_HH__

View file

@ -40,7 +40,6 @@
#include "base/stats/flags.hh" #include "base/stats/flags.hh"
#include "base/stats/mysql.hh" #include "base/stats/mysql.hh"
#include "base/stats/mysql_run.hh" #include "base/stats/mysql_run.hh"
#include "base/stats/statdb.hh"
#include "base/stats/types.hh" #include "base/stats/types.hh"
#include "base/str.hh" #include "base/str.hh"
#include "base/userinfo.hh" #include "base/userinfo.hh"
@ -493,16 +492,14 @@ MySql::configure()
/* /*
* set up all stats! * set up all stats!
*/ */
using namespace Database;
MySQL::Connection &mysql = run->conn(); MySQL::Connection &mysql = run->conn();
stat_list_t::const_iterator i, end = stats().end(); list<Info *>::const_iterator i, end = statsList().end();
for (i = stats().begin(); i != end; ++i) { for (i = statsList().begin(); i != end; ++i) {
(*i)->visit(*this); (*i)->visit(*this);
} }
for (i = stats().begin(); i != end; ++i) { for (i = statsList().begin(); i != end; ++i) {
Info *info = *i; Info *info = *i;
if (info->prereq) { if (info->prereq) {
// update the prerequisite // update the prerequisite
@ -706,7 +703,6 @@ MySql::valid() const
void void
MySql::output() MySql::output()
{ {
using namespace Database;
assert(valid()); assert(valid());
if (!configured) if (!configured)
@ -717,8 +713,8 @@ MySql::output()
MySQL::Connection &mysql = run->conn(); MySQL::Connection &mysql = run->conn();
Database::stat_list_t::const_iterator i, end = Database::stats().end(); list<Info *>::const_iterator i, end = statsList().end();
for (i = Database::stats().begin(); i != end; ++i) { for (i = statsList().begin(); i != end; ++i) {
Info *stat = *i; Info *stat = *i;
stat->visit(*this); stat->visit(*this);
if (mysql.commit()) if (mysql.commit())

View file

@ -1,84 +0,0 @@
/*
* Copyright (c) 2004-2005 The Regents of The University of Michigan
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met: redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer;
* redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution;
* neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Authors: Nathan Binkert
*/
#include "base/misc.hh"
#include "base/trace.hh"
#include "base/statistics.hh"
#include "base/stats/statdb.hh"
using namespace std;
namespace Stats {
namespace Database {
Info *
find(void *stat)
{
stat_map_t::const_iterator i = map().find(stat);
if (i == map().end())
return NULL;
return (*i).second;
}
void
regStat(void *stat, Info *data)
{
if (map().find(stat) != map().end())
panic("shouldn't register stat twice!");
stats().push_back(data);
#ifndef NDEBUG
pair<stat_map_t::iterator, bool> result =
#endif
map().insert(make_pair(stat, data));
assert(result.second && "this should never fail");
assert(map().find(stat) != map().end());
}
void
regPrint(void *stat)
{
Info *data = find(stat);
assert(data);
data->flags |= print;
}
TheDatabase &
db()
{
static TheDatabase db;
return db;
}
/* namespace Database */ }
/* namespace Stats */ }

View file

@ -1,70 +0,0 @@
/*
* Copyright (c) 2004-2005 The Regents of The University of Michigan
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met: redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer;
* redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution;
* neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Authors: Nathan Binkert
*/
#ifndef __BASE_STATS_STATDB_HH__
#define __BASE_STATS_STATDB_HH__
#include <iosfwd>
#include <list>
#include <map>
#include <string>
class Python;
namespace Stats {
class Info;
namespace Database {
typedef std::map<void *, Info *> stat_map_t;
typedef std::list<Info *> stat_list_t;
// We wrap the database in a struct to make sure it is built in time.
struct TheDatabase
{
stat_map_t map;
stat_list_t stats;
};
TheDatabase &db();
inline stat_map_t &map() { return db().map; }
inline stat_list_t &stats() { return db().stats; }
Info *find(void *stat);
void regStat(void *stat, Info *data);
void regPrint(void *stat);
inline std::string name() { return "Statistics Database"; }
/* namespace Database */ }
/* namespace Stats */ }
#endif // __BASE_STATS_STATDB_HH__

View file

@ -43,7 +43,6 @@
#include "base/misc.hh" #include "base/misc.hh"
#include "base/statistics.hh" #include "base/statistics.hh"
#include "base/stats/statdb.hh"
#include "base/stats/text.hh" #include "base/stats/text.hh"
#include "base/stats/visit.hh" #include "base/stats/visit.hh"
@ -132,11 +131,9 @@ Text::valid() const
void void
Text::output() Text::output()
{ {
using namespace Database;
ccprintf(*stream, "\n---------- Begin Simulation Statistics ----------\n"); ccprintf(*stream, "\n---------- Begin Simulation Statistics ----------\n");
stat_list_t::const_iterator i, end = stats().end(); list<Info *>::const_iterator i, end = statsList().end();
for (i = stats().begin(); i != end; ++i) for (i = statsList().begin(); i != end; ++i)
(*i)->visit(*this); (*i)->visit(*this);
ccprintf(*stream, "\n---------- End Simulation Statistics ----------\n"); ccprintf(*stream, "\n---------- End Simulation Statistics ----------\n");
stream->flush(); stream->flush();