diff -r 9fa13250abd8 src/python/swig/stats.i --- a/src/python/swig/stats.i Fri Sep 21 04:51:18 2012 -0400 +++ b/src/python/swig/stats.i Fri Sep 21 16:45:10 2012 +0200 @@ -67,14 +67,14 @@ inline void processResetQueue() { - extern CallbackQueue resetQueue; + CallbackQueue resetQueue = getResetQueue(); resetQueue.process(); } inline void processDumpQueue() { - extern CallbackQueue dumpQueue; + CallbackQueue dumpQueue = getDumpQueue(); dumpQueue.process(); } diff -r 9fa13250abd8 src/mem/ruby/profiler/Profiler.cc --- a/src/mem/ruby/profiler/Profiler.cc Fri Sep 21 04:51:18 2012 -0400 +++ b/src/mem/ruby/profiler/Profiler.cc Fri Sep 21 16:45:10 2012 +0200 @@ -439,6 +439,8 @@ { m_ruby_start = g_system_ptr->getTime(); + m_real_time_start_time = time(NULL); + m_cycles_executed_at_start.resize(m_num_of_sequencers); for (int i = 0; i < m_num_of_sequencers; i++) { if (g_system_ptr == NULL) { diff -r 9fa13250abd8 src/base/statistics.cc --- a/src/base/statistics.cc Fri Sep 21 04:51:18 2012 -0400 +++ b/src/base/statistics.cc Fri Sep 21 16:45:10 2012 +0200 @@ -433,13 +433,16 @@ return root ? root->str() : ""; } -CallbackQueue dumpQueue; -CallbackQueue resetQueue; - void registerResetCallback(Callback *cb) { - resetQueue.add(cb); + getResetQueue().add(cb); +} + +void +registerDumpCallback(Callback *cb) +{ + getDumpQueue().add(cb); } bool _enabled = false; @@ -459,12 +462,6 @@ _enabled = true; } -void -registerDumpCallback(Callback *cb) -{ - dumpQueue.add(cb); -} - } // namespace Stats void diff -r 9fa13250abd8 src/base/statistics.hh --- a/src/base/statistics.hh Fri Sep 21 04:51:18 2012 -0400 +++ b/src/base/statistics.hh Fri Sep 21 16:45:10 2012 +0200 @@ -69,6 +69,7 @@ #include "base/refcnt.hh" #include "base/str.hh" #include "base/types.hh" +#include "base/callback.hh" class Callback; @@ -3157,12 +3158,26 @@ */ void registerResetCallback(Callback *cb); +inline CallbackQueue & +getResetQueue() +{ + static CallbackQueue resetQueue; + return resetQueue; +} + /** * Register a callback that should be called whenever statistics are * about to be dumped */ void registerDumpCallback(Callback *cb); +inline CallbackQueue & +getDumpQueue() +{ + static CallbackQueue dumpQueue; + return dumpQueue; +} + std::list &statsList(); } // namespace Stats diff -r 9fa13250abd8 src/mem/ruby/system/System.cc --- a/src/mem/ruby/system/System.cc Fri Sep 21 04:51:18 2012 -0400 +++ b/src/mem/ruby/system/System.cc Fri Sep 21 16:45:10 2012 +0200 @@ -33,6 +33,7 @@ #include "base/intmath.hh" #include "base/output.hh" +#include "base/statistics.hh" #include "debug/RubyCacheTrace.hh" #include "mem/ruby/common/Address.hh" #include "mem/ruby/network/Network.hh" @@ -83,11 +84,12 @@ m_mem_vec_ptr->resize(m_memory_size_bytes); } - // - // Print ruby configuration and stats at exit - // - RubyExitCallback* rubyExitCB = new RubyExitCallback(p->stats_filename); - registerExitCallback(rubyExitCB); + ResetRubyStatsCallback* resetRubyStatsCB = new ResetRubyStatsCallback(); + Stats::registerResetCallback(resetRubyStatsCB); + + DumpRubyStatsCallback* dumpRubyStatsCB = new DumpRubyStatsCallback(p->stats_filename); + Stats::registerDumpCallback(dumpRubyStatsCB); + m_warmup_enabled = false; m_cooldown_enabled = false; } @@ -459,7 +461,14 @@ * queue is executed. */ void -RubyExitCallback::process() +ResetRubyStatsCallback::process() +{ + RubySystem::m_profiler_ptr->clearStats(); + RubySystem::getNetwork()->clearStats(); +} + +void +DumpRubyStatsCallback::process() { std::ostream *os = simout.create(stats_filename); RubySystem::printStats(*os); diff -r 9fa13250abd8 src/mem/ruby/system/System.hh --- a/src/mem/ruby/system/System.hh Fri Sep 21 04:51:18 2012 -0400 +++ b/src/mem/ruby/system/System.hh Fri Sep 21 16:45:10 2012 +0200 @@ -169,17 +169,25 @@ return out; } -class RubyExitCallback : public Callback +class ResetRubyStatsCallback : public Callback +{ + public: + virtual ~ResetRubyStatsCallback() {} + + virtual void process(); +}; + +class DumpRubyStatsCallback : public Callback { private: std::string stats_filename; public: - virtual ~RubyExitCallback() {} + virtual ~DumpRubyStatsCallback() {} - RubyExitCallback(const std::string& _stats_filename) + DumpRubyStatsCallback(const std::string& _stats_filename) { - stats_filename = _stats_filename; + stats_filename = _stats_filename; } virtual void process();