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:
parent
fb74987c52
commit
80d5f34da6
7 changed files with 47 additions and 193 deletions
|
@ -74,7 +74,6 @@ Source('loader/symtab.cc')
|
|||
|
||||
Source('stats/events.cc')
|
||||
Source('stats/output.cc')
|
||||
Source('stats/statdb.cc')
|
||||
Source('stats/text.cc')
|
||||
Source('stats/visit.cc')
|
||||
|
||||
|
|
|
@ -42,28 +42,42 @@
|
|||
#include "base/str.hh"
|
||||
#include "base/time.hh"
|
||||
#include "base/trace.hh"
|
||||
#include "base/stats/statdb.hh"
|
||||
|
||||
using namespace std;
|
||||
|
||||
namespace Stats {
|
||||
|
||||
Info *
|
||||
InfoAccess::find() const
|
||||
typedef map<const void *, Info *> MapType;
|
||||
|
||||
// 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 *
|
||||
getInfo(const void *stat)
|
||||
MapType &
|
||||
statsMap()
|
||||
{
|
||||
return Database::find(const_cast<void *>(stat));
|
||||
static MapType the_map;
|
||||
return the_map;
|
||||
}
|
||||
|
||||
void
|
||||
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
|
||||
|
@ -75,17 +89,17 @@ InfoAccess::setInit()
|
|||
Info *
|
||||
InfoAccess::info()
|
||||
{
|
||||
Info *info = find();
|
||||
assert(info);
|
||||
return info;
|
||||
MapType::const_iterator i = statsMap().find(this);
|
||||
assert(i != statsMap().end());
|
||||
return (*i).second;
|
||||
}
|
||||
|
||||
const Info *
|
||||
InfoAccess::info() const
|
||||
{
|
||||
const Info *info = find();
|
||||
assert(info);
|
||||
return info;
|
||||
MapType::const_iterator i = statsMap().find(this);
|
||||
assert(i != statsMap().end());
|
||||
return (*i).second;
|
||||
}
|
||||
|
||||
Info::Info()
|
||||
|
@ -228,10 +242,10 @@ Formula::operator+=(Temp r)
|
|||
void
|
||||
check()
|
||||
{
|
||||
typedef Database::stat_list_t::iterator iter_t;
|
||||
typedef list<Info *>::iterator iter_t;
|
||||
|
||||
iter_t i, end = Database::stats().end();
|
||||
for (i = Database::stats().begin(); i != end; ++i) {
|
||||
iter_t i, end = statsList().end();
|
||||
for (i = statsList().begin(); i != end; ++i) {
|
||||
Info *info = *i;
|
||||
assert(info);
|
||||
if (!info->check() || !info->baseCheck())
|
||||
|
@ -239,13 +253,13 @@ check()
|
|||
}
|
||||
|
||||
off_t j = 0;
|
||||
for (i = Database::stats().begin(); i != end; ++i) {
|
||||
for (i = statsList().begin(); i != end; ++i) {
|
||||
Info *info = *i;
|
||||
if (!(info->flags & print))
|
||||
info->name = "__Stat" + to_string(j++);
|
||||
}
|
||||
|
||||
Database::stats().sort(Info::less);
|
||||
statsList().sort(Info::less);
|
||||
|
||||
if (i == end)
|
||||
return;
|
||||
|
@ -253,7 +267,7 @@ check()
|
|||
iter_t last = i;
|
||||
++i;
|
||||
|
||||
for (i = Database::stats().begin(); i != end; ++i) {
|
||||
for (i = statsList().begin(); i != end; ++i) {
|
||||
if ((*i)->name == (*last)->name)
|
||||
panic("same name used twice! name=%s\n", (*i)->name);
|
||||
|
||||
|
@ -266,8 +280,8 @@ CallbackQueue resetQueue;
|
|||
void
|
||||
reset()
|
||||
{
|
||||
Database::stat_list_t::iterator i = Database::stats().begin();
|
||||
Database::stat_list_t::iterator end = Database::stats().end();
|
||||
list<Info *>::iterator i = statsList().begin();
|
||||
list<Info *>::iterator end = statsList().end();
|
||||
while (i != end) {
|
||||
Info *info = *i;
|
||||
info->reset();
|
||||
|
|
|
@ -56,6 +56,7 @@
|
|||
#include <functional>
|
||||
#include <iosfwd>
|
||||
#include <limits>
|
||||
#include <list>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
|
@ -382,7 +383,6 @@ class Vector2dInfo : public Vector2dInfoBase
|
|||
class InfoAccess
|
||||
{
|
||||
protected:
|
||||
Info *find() const;
|
||||
/** Set up an info class for this statistic */
|
||||
void setInfo(Info *info);
|
||||
/** Save Storage class parameters if any */
|
||||
|
@ -1339,7 +1339,7 @@ class Vector2dBase : public InfoAccess
|
|||
assert(_x > 0 && _y > 0 && "sizes must be positive!");
|
||||
assert(!storage && "already initialized");
|
||||
|
||||
Vector2dInfoBase *info = dynamic_cast<Vector2dInfoBase *>(find());
|
||||
Vector2dInfoBase *info = safe_cast<Vector2dInfoBase *>(this->info());
|
||||
|
||||
x = _x;
|
||||
y = _y;
|
||||
|
@ -3084,6 +3084,8 @@ sum(Temp val)
|
|||
return NodePtr(new SumNode<std::plus<Result> >(val));
|
||||
}
|
||||
|
||||
std::list<Info *> &statsList();
|
||||
|
||||
/* namespace Stats */ }
|
||||
|
||||
#endif // __BASE_STATISTICS_HH__
|
||||
|
|
|
@ -40,7 +40,6 @@
|
|||
#include "base/stats/flags.hh"
|
||||
#include "base/stats/mysql.hh"
|
||||
#include "base/stats/mysql_run.hh"
|
||||
#include "base/stats/statdb.hh"
|
||||
#include "base/stats/types.hh"
|
||||
#include "base/str.hh"
|
||||
#include "base/userinfo.hh"
|
||||
|
@ -493,16 +492,14 @@ MySql::configure()
|
|||
/*
|
||||
* set up all stats!
|
||||
*/
|
||||
using namespace Database;
|
||||
|
||||
MySQL::Connection &mysql = run->conn();
|
||||
|
||||
stat_list_t::const_iterator i, end = stats().end();
|
||||
for (i = stats().begin(); i != end; ++i) {
|
||||
list<Info *>::const_iterator i, end = statsList().end();
|
||||
for (i = statsList().begin(); i != end; ++i) {
|
||||
(*i)->visit(*this);
|
||||
}
|
||||
|
||||
for (i = stats().begin(); i != end; ++i) {
|
||||
for (i = statsList().begin(); i != end; ++i) {
|
||||
Info *info = *i;
|
||||
if (info->prereq) {
|
||||
// update the prerequisite
|
||||
|
@ -706,7 +703,6 @@ MySql::valid() const
|
|||
void
|
||||
MySql::output()
|
||||
{
|
||||
using namespace Database;
|
||||
assert(valid());
|
||||
|
||||
if (!configured)
|
||||
|
@ -717,8 +713,8 @@ MySql::output()
|
|||
|
||||
MySQL::Connection &mysql = run->conn();
|
||||
|
||||
Database::stat_list_t::const_iterator i, end = Database::stats().end();
|
||||
for (i = Database::stats().begin(); i != end; ++i) {
|
||||
list<Info *>::const_iterator i, end = statsList().end();
|
||||
for (i = statsList().begin(); i != end; ++i) {
|
||||
Info *stat = *i;
|
||||
stat->visit(*this);
|
||||
if (mysql.commit())
|
||||
|
|
|
@ -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 */ }
|
|
@ -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__
|
|
@ -43,7 +43,6 @@
|
|||
|
||||
#include "base/misc.hh"
|
||||
#include "base/statistics.hh"
|
||||
#include "base/stats/statdb.hh"
|
||||
#include "base/stats/text.hh"
|
||||
#include "base/stats/visit.hh"
|
||||
|
||||
|
@ -132,11 +131,9 @@ Text::valid() const
|
|||
void
|
||||
Text::output()
|
||||
{
|
||||
using namespace Database;
|
||||
|
||||
ccprintf(*stream, "\n---------- Begin Simulation Statistics ----------\n");
|
||||
stat_list_t::const_iterator i, end = stats().end();
|
||||
for (i = stats().begin(); i != end; ++i)
|
||||
list<Info *>::const_iterator i, end = statsList().end();
|
||||
for (i = statsList().begin(); i != end; ++i)
|
||||
(*i)->visit(*this);
|
||||
ccprintf(*stream, "\n---------- End Simulation Statistics ----------\n");
|
||||
stream->flush();
|
||||
|
|
Loading…
Reference in a new issue