Get rid of the Statistics and Statreset ParamContexts, and
authorNathan Binkert <binkertn@umich.edu>
Sun, 18 Feb 2007 06:52:32 +0000 (22:52 -0800)
committerNathan Binkert <binkertn@umich.edu>
Sun, 18 Feb 2007 06:52:32 +0000 (22:52 -0800)
expose all of the relevant functionality to python.  Clean
up the mysql code while we're at it.

--HG--
extra : convert_revision : 5b711202a5a452b8875ebefb136a156b65c24279

16 files changed:
src/SConscript
src/base/statistics.hh
src/base/stats/mysql.cc
src/base/stats/mysql.hh
src/base/stats/output.cc [new file with mode: 0644]
src/base/stats/text.cc
src/base/stats/text.hh
src/python/SConscript
src/python/m5/main.py
src/python/m5/objects/Root.py
src/python/swig/stats.i [new file with mode: 0644]
src/sim/main.cc
src/sim/pseudo_inst.cc
src/sim/serialize.cc
src/sim/stat_control.cc
src/sim/stat_control.hh

index d6b4c6c8d036035787456767e48c77a6d90871f9..c93605ff7d735062fc52e482d9ad9c728b770c8e 100644 (file)
@@ -79,6 +79,7 @@ base_sources = Split('''
        base/loader/object_file.cc
        base/loader/symtab.cc
        base/stats/events.cc
+        base/stats/output.cc
        base/stats/statdb.cc
        base/stats/visit.cc
        base/stats/text.cc
@@ -134,6 +135,7 @@ base_sources = Split('''
         python/swig/main_wrap.cc
         python/swig/event_wrap.cc
         python/swig/random_wrap.cc
+        python/swig/stats_wrap.cc
         python/swig/trace_wrap.cc
         python/swig/pyevent.cc
 
@@ -148,7 +150,6 @@ base_sources = Split('''
        sim/sim_events.cc
        sim/sim_object.cc
        sim/startup.cc
-       sim/stat_context.cc
        sim/stat_control.cc
        sim/system.cc
         ''')
index 2b1b327e5b1bd70c8a182cc5956dca58ef53dcfe..8168473a19861a5e9a4ec13d51c7432ff6f413ed 100644 (file)
@@ -2839,6 +2839,7 @@ class Temp
  */
 
 void check();
+void dump();
 void reset();
 void registerResetCallback(Callback *cb);
 
index 0fb31f4ce9dca55e2a944acaa83c6aecb8e2e2db..01a82c4bf88d7453625c3466ec16ba742db0bf25 100644 (file)
@@ -49,14 +49,6 @@ using namespace std;
 
 namespace Stats {
 
-MySqlRun MySqlDB;
-
-bool
-MySqlConnected()
-{
-    return MySqlDB.connected();
-}
-
 void
 MySqlRun::connect(const string &host, const string &user, const string &passwd,
                   const string &db, const string &name, const string &sample,
@@ -198,7 +190,7 @@ SetupStat::init()
 unsigned
 SetupStat::setup()
 {
-    MySQL::Connection &mysql = MySqlDB.conn();
+    MySQL::Connection &mysql = run->conn();
 
     stringstream insert;
     ccprintf(insert,
@@ -317,7 +309,7 @@ void
 InsertData::flush()
 {
     if (size) {
-        MySQL::Connection &mysql = MySqlDB.conn();
+        MySQL::Connection &mysql = run->conn();
         assert(mysql.connected());
         mysql.query(query);
         if (mysql.error)
@@ -349,7 +341,7 @@ InsertData::insert()
     first = false;
 
     size += sprintf(query + size, "(%u,%d,%d,%u,%llu,\"%f\")",
-                    stat, x, y, MySqlDB.run(), (unsigned long long)tick,
+                    stat, x, y, run->run(), (unsigned long long)tick,
                     data);
 }
 
@@ -367,7 +359,7 @@ struct InsertSubData
 void
 InsertSubData::setup()
 {
-    MySQL::Connection &mysql = MySqlDB.conn();
+    MySQL::Connection &mysql = run->conn();
     assert(mysql.connected());
     stringstream insert;
     ccprintf(insert,
@@ -386,7 +378,7 @@ InsertSubData::setup()
 void
 InsertFormula(uint16_t stat, const string &formula)
 {
-    MySQL::Connection &mysql = MySqlDB.conn();
+    MySQL::Connection &mysql = run->conn();
     assert(mysql.connected());
     stringstream insert_formula;
     ccprintf(insert_formula,
@@ -400,7 +392,7 @@ InsertFormula(uint16_t stat, const string &formula)
     stringstream insert_ref;
     ccprintf(insert_ref,
              "INSERT INTO formula_ref(fr_stat,fr_run) values(%d, %d)",
-             stat, MySqlDB.run());
+             stat, run->run());
 
     mysql.query(insert_ref);
 //    if (mysql.error)
@@ -413,7 +405,7 @@ InsertFormula(uint16_t stat, const string &formula)
 void
 UpdatePrereq(uint16_t stat, uint16_t prereq)
 {
-    MySQL::Connection &mysql = MySqlDB.conn();
+    MySQL::Connection &mysql = run->conn();
     assert(mysql.connected());
     stringstream update;
     ccprintf(update, "UPDATE stats SET st_prereq=%d WHERE st_id=%d",
@@ -426,6 +418,29 @@ UpdatePrereq(uint16_t stat, uint16_t prereq)
         panic("could not commit transaction\n%s\n", mysql.error);
 }
 
+MySql::MySql()
+    : run(new MySqlRun)
+{}
+
+MySql::~MySql()
+{
+    delete run;
+}
+
+void
+MySql::connect(const string &host, const string &user, const string &passwd,
+               const string &db, const string &name, const string &sample,
+               const string &project)
+{
+    run->connect(host, user, passwd, db, name, sample, project);
+}
+
+bool
+MySql::connected() const
+{
+    run->connected();
+}
+
 void
 MySql::configure()
 {
@@ -434,7 +449,7 @@ MySql::configure()
      */
     using namespace Database;
 
-    MySQL::Connection &mysql = MySqlDB.conn();
+    MySQL::Connection &mysql = run->conn();
 
     stat_list_t::const_iterator i, end = stats().end();
     for (i = stats().begin(); i != end; ++i) {
@@ -605,7 +620,7 @@ MySql::configure(const FormulaData &data)
 bool
 MySql::valid() const
 {
-    return MySqlDB.connected();
+    return run->connected();
 }
 
 void
@@ -620,7 +635,7 @@ MySql::output()
     // store sample #
     newdata.tick = curTick;
 
-    MySQL::Connection &mysql = MySqlDB.conn();
+    MySQL::Connection &mysql = run->conn();
 
     Database::stat_list_t::const_iterator i, end = Database::stats().end();
     for (i = Database::stats().begin(); i != end; ++i) {
@@ -825,4 +840,21 @@ MySql::visit(const FormulaData &data)
         output(data);
 }
 
-/* namespace Stats */ }
+bool
+initMySQL(string host, string user, string password, string database,
+           string name, string sample, string project)
+{
+    extern list<Output *> OutputList;
+    static MySql mysql;
+
+    if (mysql.connected())
+        return false;
+
+    if (user.empty())
+        user = username();
+
+    mysql.connect(host, user, password, database, name, sample, project);
+    OutputList.push_back(&mysql);
+
+    return true;
+}
index 50f7d9e9792f30a0117ee7769383836face53e8e..a43c74eccbf5d784a56d22f8d2dd691d6adb026e 100644 (file)
 #include <string>
 
 #include "base/stats/output.hh"
+#include "config/use_mysql.hh"
 
 namespace MySQL { class Connection; }
 namespace Stats {
 
 class DistDataData;
 class MySqlRun;
-bool MySqlConnected();
-extern MySqlRun MySqlDB;
 
 struct SetupStat
 {
@@ -95,6 +94,9 @@ class InsertData
 class MySql : public Output
 {
   protected:
+    MySqlRun *run; /* Hide the implementation so we don't have a
+                      #include mess */
+
     SetupStat stat;
     InsertData newdata;
     std::list<FormulaData *> formulas;
@@ -116,6 +118,17 @@ class MySql : public Output
         assert(i != idmap.end());
         return (*i).second;
     }
+
+  public:
+    MySql(MySqlRun &_run){}
+    ~MySql();
+
+    void connect(const std::string &host, const std::string &user,
+                 const std::string &passwd, const std::string &db,
+                 const std::string &name, const std::string &sample,
+                 const std::string &project);
+    bool connected() const;
+
   public:
     // Implement Visit
     virtual void visit(const ScalarData &data);
@@ -149,6 +162,20 @@ class MySql : public Output
     void configure(const FormulaData &data);
 };
 
+bool initMySQL(std::string host, std::string database, std::string user = "",
+    std::string passwd = "", std::string name = "test",
+    std::string sample = "0", std::string project = "test");
+
+#if !USE_MYSQL
+inline bool
+initMySQL(std::string host, std::string user, std::string password,
+    std::string database, std::string name, std::string sample,
+    std::string project)
+{
+    return false;
+}
+#endif
+
 /* namespace Stats */ }
 
 #endif // __BASE_STATS_MYSQL_HH__
diff --git a/src/base/stats/output.cc b/src/base/stats/output.cc
new file mode 100644 (file)
index 0000000..9f2b91c
--- /dev/null
@@ -0,0 +1,70 @@
+/*
+ * 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 <list>
+
+#include "base/stats/output.hh"
+#include "sim/eventq.hh"
+#include "sim/host.hh"
+
+using namespace std;
+
+namespace Stats {
+
+Tick lastDump(0);
+list<Output *> OutputList;
+
+void
+dump()
+{
+    assert(lastDump <= curTick);
+    if (lastDump == curTick)
+        return;
+    lastDump = curTick;
+
+    list<Output *>::iterator i = OutputList.begin();
+    list<Output *>::iterator end = OutputList.end();
+    for (; i != end; ++i) {
+        Output *output = *i;
+        if (!output->valid())
+            continue;
+
+        output->output();
+    }
+}
+
+/* namespace Stats */ }
+
+void
+debugDumpStats()
+{
+    Stats::dump();
+}
+
index ae0d655379b1be765290c8dd5373177eb4c6eb97..66c5955d76e08f029c60507fea9da97b564a4220 100644 (file)
@@ -725,4 +725,25 @@ Text::visit(const FormulaData &data)
     visit((const VectorData &)data);
 }
 
+bool
+initText(const string &filename, bool desc, bool compat)
+{
+    static Text text;
+    static bool connected = false;
+
+    if (connected)
+        return false;
+
+    extern list<Output *> OutputList;
+
+    text.open(*simout.find(filename));
+    text.descriptions = desc;
+    text.compat = compat;
+    OutputList.push_back(&text);
+    connected = true;
+
+    return true;
+}
+
+
 /* namespace Stats */ }
index b3faf5ad533a2bff694925384399048d57482694..0516bc60d10d1201beca8604c9f38ae72065be5b 100644 (file)
@@ -34,6 +34,7 @@
 #include <iosfwd>
 #include <string>
 
+#include "base/output.hh"
 #include "base/stats/output.hh"
 
 namespace Stats {
@@ -73,6 +74,8 @@ class Text : public Output
     virtual void output();
 };
 
+bool initText(const std::string &filename, bool desc=true, bool compat=true);
+
 /* namespace Stats */ }
 
 #endif // __BASE_STATS_TEXT_HH__
index 51271650f21ec3cc82f84855b119e5e06644d486..4dd614cfb71520f754aba4829242fe27a89910d5 100644 (file)
@@ -110,6 +110,7 @@ swig_it('main')
 swig_it('debug')
 swig_it('event')
 swig_it('random')
+swig_it('stats')
 swig_it('trace')
 
 # Action function to build the zip archive.  Uses the PyZipFile module
index 98dc829d4a83ad628266f1bb03baf0c8a16de630..48c75434feef7373597eef69e2299984dccbed4c 100644 (file)
@@ -264,7 +264,7 @@ def main():
     import objects
 
     # set stats options
-    objects.Statistics.text_file = options.stats_file
+    internal.stats.initText(options.stats_file)
 
     # set debugging options
     for when in options.debug_break:
index c78ae6ccb2082fb09433c6e5e5b67d0e795198b1..cf5174ef3689b7ca0ba33e6de0428c10c0aeff4d 100644 (file)
@@ -1,8 +1,6 @@
 from m5.SimObject import SimObject
 from m5.params import *
 from Serialize import Serialize
-from Serialize import Statreset
-from Statistics import Statistics
 
 class Root(SimObject):
     type = 'Root'
@@ -12,7 +10,5 @@ class Root(SimObject):
         "print a progress message every n ticks (0 = never)")
     output_file = Param.String('cout', "file to dump simulator output to")
     checkpoint = Param.String('', "checkpoint file to load")
-#    stats = Param.Statistics(Statistics(), "statistics object")
 #    serialize = Param.Serialize(Serialize(), "checkpoint generation options")
-    stats = Statistics()
     serialize = Serialize()
diff --git a/src/python/swig/stats.i b/src/python/swig/stats.i
new file mode 100644 (file)
index 0000000..d6b39c2
--- /dev/null
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2006 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
+ */
+
+%module stats
+
+%include "std_string.i"
+
+%{
+#include "base/statistics.hh"
+#include "base/stats/mysql.hh"
+#include "base/stats/text.hh"
+#include "sim/stat_control.hh"
+%}
+
+namespace Stats {
+void initSimStats();
+void initText(const std::string &filename, bool desc=true, bool compat=true);
+void initMySQL(std::string host, std::string database, std::string user = "",
+    std::string passwd = "", std::string name = "test",
+    std::string sample = "0", std::string project = "test");
+
+void StatEvent(bool dump, bool reset, Tick when = curTick, Tick repeat = 0);
+
+void dump();
+void reset();
+
+/* namespace Stat */ }
+
+%wrapper %{
+// fix up module name to reflect the fact that it's inside the m5 package
+#undef SWIG_name
+#define SWIG_name "m5.internal._stats"
+%}
index 13850f2550baa949d099d5573d9ff46dab6cac9b..45819f880f121e1782d64fb34211d6d66b9dddee 100644 (file)
@@ -53,6 +53,7 @@
 #include "base/output.hh"
 #include "base/pollevent.hh"
 #include "base/statistics.hh"
+#include "base/stats/output.hh"
 #include "base/str.hh"
 #include "base/time.hh"
 #include "config/pythonhome.hh"
@@ -220,7 +221,7 @@ loadIniFile(PyObject *_resolveFunc)
     inifile.load(simout.resolve("config.ini"));
 
     // Initialize statistics database
-    Stats::InitSimStats();
+    Stats::initSimStats();
 }
 
 
@@ -297,7 +298,6 @@ finalInit()
     SimStartup();
 }
 
-
 /** Simulate for num_cycles additional cycles.  If num_cycles is -1
  * (the default), do not limit simulation; some other event must
  * terminate the loop.  Exported to Python via SWIG.
@@ -350,16 +350,12 @@ simulate(Tick num_cycles = MaxTick)
             async_event = false;
             if (async_dump) {
                 async_dump = false;
-
-                using namespace Stats;
-                SetupEvent(Dump, curTick);
+                Stats::StatEvent(true, false);
             }
 
             if (async_dumpreset) {
                 async_dumpreset = false;
-
-                using namespace Stats;
-                SetupEvent(Dump | Reset, curTick);
+                Stats::StatEvent(true, true);
             }
 
             if (async_exit) {
@@ -469,5 +465,5 @@ doExitCleanup()
     ParamContext::cleanupAllContexts();
 
     // print simulation stats
-    Stats::DumpNow();
+    Stats::dump();
 }
index 4a8c0eb66072a66ea945aa9631b150f33520a05c..66ebc10e141936ee7f3659da92326a3ca881fc6d 100644 (file)
@@ -32,6 +32,7 @@
 #include <fcntl.h>
 #include <unistd.h>
 
+#include <fstream>
 #include <string>
 
 #include "arch/vtophys.hh"
@@ -199,8 +200,7 @@ namespace AlphaPseudo
         Tick when = curTick + delay * Clock::Int::ns;
         Tick repeat = period * Clock::Int::ns;
 
-        using namespace Stats;
-        SetupEvent(Reset, when, repeat);
+        Stats::StatEvent(false, true, when, repeat);
     }
 
     void
@@ -213,8 +213,7 @@ namespace AlphaPseudo
         Tick when = curTick + delay * Clock::Int::ns;
         Tick repeat = period * Clock::Int::ns;
 
-        using namespace Stats;
-        SetupEvent(Dump, when, repeat);
+        Stats::StatEvent(true, false, when, repeat);
     }
 
     void
@@ -254,8 +253,7 @@ namespace AlphaPseudo
         Tick when = curTick + delay * Clock::Int::ns;
         Tick repeat = period * Clock::Int::ns;
 
-        using namespace Stats;
-        SetupEvent(Dump|Reset, when, repeat);
+        Stats::StatEvent(true, true, when, repeat);
     }
 
     void
index 1ff16976deb2f3a99fab8e889db3f562427354da..d32bb1142e5fdd13a06570588e5a9add3c5afed3 100644 (file)
@@ -407,36 +407,3 @@ Checkpoint::sectionExists(const std::string &section)
 {
     return db->sectionExists(section);
 }
-
-/** Hacked stat reset event */
-
-class StatresetParamContext : public ParamContext
-{
-  public:
-    StatresetParamContext(const string &section);
-    ~StatresetParamContext();
-    void startup();
-};
-
-StatresetParamContext statParams("statsreset");
-
-Param<Tick> reset_cycle(&statParams, "reset_cycle",
-                        "Cycle to reset stats on", 0);
-
-StatresetParamContext::StatresetParamContext(const string &section)
-    : ParamContext(section)
-{ }
-
-StatresetParamContext::~StatresetParamContext()
-{
-}
-
-void
-StatresetParamContext::startup()
-{
-    if (reset_cycle > 0) {
-        Stats::SetupEvent(Stats::Reset, curTick + reset_cycle, 0);
-        cprintf("Stats reset event scheduled for %lli\n",
-                curTick + reset_cycle);
-    }
-}
index 3fad8beb511a7d3d8799f25f5c4e47ebe64367b5..228c83898d447d223a79dd179acf29da6f154410 100644 (file)
 #include "base/callback.hh"
 #include "base/hostinfo.hh"
 #include "base/statistics.hh"
-#include "base/str.hh"
 #include "base/time.hh"
-#include "base/stats/output.hh"
 #include "cpu/base.hh"
 #include "sim/eventq.hh"
-#include "sim/sim_object.hh"
-#include "sim/stat_control.hh"
-#include "sim/root.hh"
 
 using namespace std;
 
@@ -63,11 +58,9 @@ namespace Stats {
 
 Time statTime(true);
 Tick startTick;
-Tick lastDump(0);
 
-class SimTicksReset : public Callback
+struct SimTicksReset : public Callback
 {
-  public:
     void process()
     {
         statTime.set();
@@ -92,7 +85,7 @@ statElapsedTicks()
 SimTicksReset simTicksReset;
 
 void
-InitSimStats()
+initSimStats()
 {
     simInsts
         .functor(BaseCPU::numSimulatedInstructions)
@@ -153,81 +146,40 @@ InitSimStats()
     registerResetCallback(&simTicksReset);
 }
 
-class StatEvent : public Event
+class _StatEvent : public Event
 {
-  protected:
-    int flags;
+  private:
+    bool dump;
+    bool reset;
     Tick repeat;
 
   public:
-    StatEvent(EventQueue *queue, int _flags, Tick _when, Tick _repeat);
-    virtual void process();
-    virtual const char *description();
-};
-
-StatEvent::StatEvent(EventQueue *queue, int _flags, Tick _when, Tick _repeat)
-    : Event(queue, Stat_Event_Pri),
-      flags(_flags), repeat(_repeat)
-{
-    setFlags(AutoDelete);
-    schedule(_when);
-}
-
-const char *
-StatEvent::description()
-{
-    return "Statistics dump and/or reset";
-}
-
-void
-StatEvent::process()
-{
-    if (flags & Stats::Dump)
-        DumpNow();
-
-    if (flags & Stats::Reset) {
-        cprintf("Resetting stats at cycle %d!\n", curTick);
-        reset();
+    _StatEvent(bool _dump, bool _reset, Tick _when, Tick _repeat)
+        : Event(&mainEventQueue, Stat_Event_Pri), dump(_dump), reset(_reset),
+          repeat(_repeat)
+    {
+        setFlags(AutoDelete);
+        schedule(_when);
     }
 
-    if (repeat)
-        schedule(curTick + repeat);
-}
+    virtual void
+    process()
+    {
+        if (dump)
+            Stats::dump();
 
-list<Output *> OutputList;
+        if (reset)
+            Stats::reset();
 
-void
-DumpNow()
-{
-    assert(lastDump <= curTick);
-    if (lastDump == curTick)
-        return;
-    lastDump = curTick;
-
-    list<Output *>::iterator i = OutputList.begin();
-    list<Output *>::iterator end = OutputList.end();
-    for (; i != end; ++i) {
-        Output *output = *i;
-        if (!output->valid())
-            continue;
-
-        output->output();
+        if (repeat)
+            new _StatEvent(dump, reset, curTick + repeat, repeat);
     }
-}
+};
 
 void
-SetupEvent(int flags, Tick when, Tick repeat, EventQueue *queue)
+StatEvent(bool dump, bool reset, Tick when, Tick repeat)
 {
-    if (queue == NULL)
-        queue = &mainEventQueue;
-
-    new StatEvent(queue, flags, when, repeat);
+    new _StatEvent(dump, reset, when, repeat);
 }
 
 /* namespace Stats */ }
-
-void debugDumpStats()
-{
-    Stats::DumpNow();
-}
-
index 67f7cc491e3d0e57f3b7f032510f85f34f4072c6..1efa2554eda6ee4c7f54e9732f22fc0aad78f7ec 100644 (file)
 #ifndef __SIM_STAT_CONTROL_HH__
 #define __SIM_STAT_CONTROL_HH__
 
-#include <fstream>
-#include <list>
-
-class EventQueue;
-
 namespace Stats {
 
-enum {
-    Reset = 0x1,
-    Dump = 0x2
-};
-
-class Output;
-extern std::list<Output *> OutputList;
-
-void DumpNow();
-void SetupEvent(int flags, Tick when, Tick repeat = 0, EventQueue *queue = NULL);
-
-void InitSimStats();
+void initSimStats();
+void StatEvent(bool dump, bool reset, Tick when = curTick, Tick repeat = 0);
 
 /* namespace Stats */ }