stats: get rid of the convoluted 'database' code.
authorNathan Binkert <nate@binkert.org>
Mon, 23 Feb 2009 20:22:17 +0000 (12:22 -0800)
committerNathan Binkert <nate@binkert.org>
Mon, 23 Feb 2009 20:22:17 +0000 (12:22 -0800)
Just use the stuff directly and things ought to be more clear

src/base/SConscript
src/base/statistics.cc
src/base/statistics.hh
src/base/stats/mysql.cc
src/base/stats/statdb.cc [deleted file]
src/base/stats/statdb.hh [deleted file]
src/base/stats/text.cc

index 80a58cca9fb2b25f7b897084c4754060925bc11b..ffad1929ad69865055fdc9b9fc2c76d94833fa95 100644 (file)
@@ -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')
 
index 93c1742b05f29a0a2acad7c38139ff75135a44e6..63741d4c6a79d527f04637f74d4416732fcf34ed 100644 (file)
 #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();
index 0bc770899f6a8e9689e1d1f6a4d83a50069c6228..5d894e8e1ec22e312d007b27a8c89aa3e5529352 100644 (file)
@@ -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__
index 2f096765fea5f4b5d5a1cfa3c2d2b33e95e03379..42464993df2200c596a9b6090ce74ed2f7a40a3e 100644 (file)
@@ -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())
diff --git a/src/base/stats/statdb.cc b/src/base/stats/statdb.cc
deleted file mode 100644 (file)
index 8ead17c..0000000
+++ /dev/null
@@ -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 */ }
diff --git a/src/base/stats/statdb.hh b/src/base/stats/statdb.hh
deleted file mode 100644 (file)
index d12c616..0000000
+++ /dev/null
@@ -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__
index 877c4c65055cd9ee10804bb33c590ca45cfe920a..14300a0f8a518023bd389f7107706f185e0280ad 100644 (file)
@@ -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();