diff options
-rw-r--r-- | src/base/remote_gdb.cc | 16 | ||||
-rw-r--r-- | src/base/remote_gdb.hh | 16 | ||||
-rw-r--r-- | src/sim/ticked_object.cc | 12 | ||||
-rw-r--r-- | src/sim/ticked_object.hh | 35 |
4 files changed, 26 insertions, 53 deletions
diff --git a/src/base/remote_gdb.cc b/src/base/remote_gdb.cc index 3b436cced..6ed5957d7 100644 --- a/src/base/remote_gdb.cc +++ b/src/base/remote_gdb.cc @@ -289,17 +289,18 @@ BaseRemoteGDB::TrapEvent::process() } void -BaseRemoteGDB::SingleStepEvent::process() +BaseRemoteGDB::processSingleStepEvent() { - if (!gdb->singleStepEvent.scheduled()) - gdb->scheduleInstCommitEvent(&gdb->singleStepEvent, 1); - gdb->trap(SIGTRAP); + if (!singleStepEvent.scheduled()) + scheduleInstCommitEvent(&singleStepEvent, 1); + trap(SIGTRAP); } BaseRemoteGDB::BaseRemoteGDB(System *_system, ThreadContext *c) : - inputEvent(NULL), trapEvent(this), listener(NULL), - number(-1), fd(-1), active(false), attached(false), system(_system), - context(c), singleStepEvent(this) + inputEvent(NULL), trapEvent(this), listener(NULL), number(-1), + fd(-1), active(false), attached(false), system(_system), + context(c), + singleStepEvent([this]{ processSingleStepEvent(); }, name()) { } @@ -1123,4 +1124,3 @@ BaseRemoteGDB::hex2i(const char **srcp) *srcp = src; return r; } - diff --git a/src/base/remote_gdb.hh b/src/base/remote_gdb.hh index b7de0ae54..121faaf2e 100644 --- a/src/base/remote_gdb.hh +++ b/src/base/remote_gdb.hh @@ -260,20 +260,8 @@ class BaseRemoteGDB return trap(SIGTRAP); } - protected: - class SingleStepEvent : public Event - { - protected: - BaseRemoteGDB *gdb; - - public: - SingleStepEvent(BaseRemoteGDB *g) : gdb(g) - {} - - void process(); - }; - - SingleStepEvent singleStepEvent; + void processSingleStepEvent(); + EventFunctionWrapper singleStepEvent; void clearSingleStep(); void setSingleStep(); diff --git a/src/sim/ticked_object.cc b/src/sim/ticked_object.cc index a9f3aceb7..1a04dc14f 100644 --- a/src/sim/ticked_object.cc +++ b/src/sim/ticked_object.cc @@ -46,7 +46,7 @@ Ticked::Ticked(ClockedObject &object_, Stats::Scalar *imported_num_cycles, Event::Priority priority) : object(object_), - event(*this, priority), + event([this]{ processClockEvent(); }, name(), false, priority), running(false), lastStopped(0), /* Allocate numCycles if an external stat wasn't passed in */ @@ -56,6 +56,16 @@ Ticked::Ticked(ClockedObject &object_, { } void +Ticked::processClockEvent() { + ++tickCycles; + ++numCycles; + countCycles(Cycles(1)); + evaluate(); + if (running) + object.schedule(event, object.clockEdge(Cycles(1))); +} + +void Ticked::regStats() { if (numCyclesLocal) { diff --git a/src/sim/ticked_object.hh b/src/sim/ticked_object.hh index 3ba0045fc..ad7d6e93b 100644 --- a/src/sim/ticked_object.hh +++ b/src/sim/ticked_object.hh @@ -60,39 +60,14 @@ class TickedObjectParams; class Ticked : public Serializable { protected: - /** An event to call process periodically */ - class ClockEvent : public Event - { - public: - Ticked &owner; - - ClockEvent(Ticked &owner_, Priority priority) : - Event(priority), - owner(owner_) - { } - - /** Evaluate and reschedule */ - void - process() - { - ++owner.tickCycles; - ++owner.numCycles; - owner.countCycles(Cycles(1)); - owner.evaluate(); - if (owner.running) { - owner.object.schedule(this, - owner.object.clockEdge(Cycles(1))); - } - } - }; - - friend class ClockEvent; - /** ClockedObject who is responsible for this Ticked's actions/stats */ ClockedObject &object; - /** The single instance of ClockEvent used */ - ClockEvent event; + /** The wrapper for processClockEvent */ + EventFunctionWrapper event; + + /** Evaluate and reschedule */ + void processClockEvent(); /** Have I been started? and am not stopped */ bool running; |