X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fsim%2Fstat_control.cc;h=75e717bfa52055b6e802acb57437fd24d7eea90e;hb=072f78471d11c31b6009beb572296f704912d0f7;hp=965c081eeebb96141db7946a79935ee5a3ebf82d;hpb=542d0ceebca1d24bfb433ce9fe916b0586f8d029;p=gem5.git diff --git a/src/sim/stat_control.cc b/src/sim/stat_control.cc index 965c081ee..75e717bfa 100644 --- a/src/sim/stat_control.cc +++ b/src/sim/stat_control.cc @@ -1,5 +1,19 @@ /* + * Copyright (c) 2012 ARM Limited + * All rights reserved + * + * The license below extends only to copyright in the software and shall + * not be construed as granting a license to any other intellectual + * property including but not limited to intellectual property relating + * to a hardware implementation of the functionality of the software + * licensed hereunder. You may use the software subject to the license + * terms below provided that you ensure that this notice is replicated + * unmodified and in its entirety in all distributions of the software, + * modified or unmodified, in source code or in binary form. + * * Copyright (c) 2004-2005 The Regents of The University of Michigan + * Copyright (c) 2013 Advanced Micro Devices, Inc. + * Copyright (c) 2013 Mark D. Hill and David A. Wood * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -26,6 +40,7 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Authors: Nathan Binkert + * Sascha Bischoff */ // This file will contain default statistics for the simulator that @@ -39,14 +54,8 @@ #include "base/hostinfo.hh" #include "base/statistics.hh" #include "base/time.hh" -#include "config/the_isa.hh" -#if THE_ISA == NO_ISA -#include "arch/noisa/cpu_dummy.hh" -#else #include "cpu/base.hh" -#endif - -#include "sim/eventq.hh" +#include "sim/global_event.hh" #include "sim/stat_control.hh" using namespace std; @@ -61,6 +70,8 @@ namespace Stats { Time statTime(true); Tick startTick; +GlobalEvent *dumpEvent; + struct SimTicksReset : public Callback { void process() @@ -146,8 +157,8 @@ Global::Global() finalTick .functor(statFinalTick) .name("final_tick") - .desc("Number of ticks from beginning of simulation \ -(restored from checkpoints and never reset)") + .desc("Number of ticks from beginning of simulation " + "(restored from checkpoints and never reset)") ; hostInstRate @@ -198,7 +209,10 @@ initSimStats() static Global global; } -class StatEvent : public Event +/** + * Event to dump and/or reset the statistics. + */ +class StatEvent : public GlobalEvent { private: bool dump; @@ -206,8 +220,8 @@ class StatEvent : public Event Tick repeat; public: - StatEvent(bool _dump, bool _reset, Tick _repeat) - : Event(Stat_Event_Pri, AutoDelete), + StatEvent(Tick _when, bool _dump, bool _reset, Tick _repeat) + : GlobalEvent(_when, Stat_Event_Pri, 0), dump(_dump), reset(_reset), repeat(_repeat) { } @@ -225,13 +239,64 @@ class StatEvent : public Event Stats::schedStatEvent(dump, reset, curTick() + repeat, repeat); } } + + const char *description() const { return "GlobalStatEvent"; } }; void schedStatEvent(bool dump, bool reset, Tick when, Tick repeat) { - Event *event = new StatEvent(dump, reset, repeat); - mainEventQueue.schedule(event, when); + // simQuantum is being added to the time when the stats would be + // dumped so as to ensure that this event happens only after the next + // sync amongst the event queues. Asingle event queue simulation + // should remain unaffected. + dumpEvent = new StatEvent(when + simQuantum, dump, reset, repeat); +} + +void +periodicStatDump(Tick period) +{ + /* + * If the period is set to 0, then we do not want to dump periodically, + * thus we deschedule the event. Else, if the period is not 0, but the event + * has already been scheduled, we need to get rid of the old event before we + * create a new one, as the old event will no longer be moved forward in the + * event that we resume from a checkpoint. + */ + if (dumpEvent != NULL && (period == 0 || dumpEvent->scheduled())) { + // Event should AutoDelete, so we do not need to free it. + dumpEvent->deschedule(); + } + + /* + * If the period is not 0, we schedule the event. If this is called with a + * period that is less than the current tick, then we shift the first dump + * by curTick. This ensures that we do not schedule the event is the past. + */ + if (period != 0) { + // Schedule the event + if (period >= curTick()) { + schedStatEvent(true, true, (Tick)period, (Tick)period); + } else { + schedStatEvent(true, true, (Tick)period + curTick(), (Tick)period); + } + } +} + +void +updateEvents() +{ + /* + * If the dumpEvent has been scheduled, but is scheduled in the past, then + * we need to shift the event to be at a valid point in time. Therefore, we + * shift the event by curTick. + */ + if (dumpEvent != NULL && + (dumpEvent->scheduled() && dumpEvent->when() < curTick())) { + // shift by curTick() and reschedule + Tick _when = dumpEvent->when(); + dumpEvent->reschedule(_when + curTick()); + } } } // namespace Stats