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/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')
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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__
|
||||||
|
|
|
@ -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())
|
||||||
|
|
|
@ -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/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();
|
||||||
|
|
Loading…
Reference in a new issue