diff -r 77ac04d2ba49 -r 309e6662ccde src/cpu/simple/timing.cc --- a/src/cpu/simple/timing.cc Mon Dec 19 13:55:07 2011 +0000 +++ b/src/cpu/simple/timing.cc Mon Dec 19 13:56:02 2011 +0000 @@ -862,7 +862,7 @@ // faster than a CPU we could get two responses before // next_tick expires if (!retryEvent.scheduled()) - schedule(retryEvent, next_tick); + cpu->schedule(retryEvent, next_tick); return false; } } diff -r 77ac04d2ba49 -r 309e6662ccde src/dev/io_device.cc --- a/src/dev/io_device.cc Mon Dec 19 13:55:07 2011 +0000 +++ b/src/dev/io_device.cc Mon Dec 19 13:56:02 2011 +0000 @@ -136,7 +136,7 @@ else if (backoffTime < maxBackoffDelay) backoffTime <<= 1; - reschedule(backoffEvent, curTick() + backoffTime, true); + device->reschedule(backoffEvent, curTick() + backoffTime, true); DPRINTF(DMA, "Backoff time set to %d ticks\n", backoffTime); @@ -164,7 +164,8 @@ if (state->totBytes == state->numBytes) { if (state->completionEvent) { if (state->delay) - schedule(state->completionEvent, curTick() + state->delay); + device->schedule(state->completionEvent, + curTick() + state->delay); else state->completionEvent->process(); } @@ -234,7 +235,7 @@ if (transmitList.size() && backoffTime && !inRetry) { DPRINTF(DMA, "Scheduling backoff for %d\n", curTick()+backoffTime); if (!backoffEvent.scheduled()) - schedule(backoffEvent, backoffTime + curTick()); + device->schedule(backoffEvent, backoffTime + curTick()); } DPRINTF(DMA, "TransmitList: %d, backoffTime: %d inRetry: %d es: %d\n", transmitList.size(), backoffTime, inRetry, @@ -320,7 +321,7 @@ !backoffEvent.scheduled()) { DPRINTF(DMA, "-- Scheduling backoff timer for %d\n", backoffTime+curTick()); - schedule(backoffEvent, backoffTime + curTick()); + device->schedule(backoffEvent, backoffTime + curTick()); } } else if (state == Enums::atomic) { transmitList.pop_front(); @@ -342,7 +343,8 @@ if (state->totBytes == state->numBytes) { if (state->completionEvent) { assert(!state->completionEvent->scheduled()); - schedule(state->completionEvent, curTick() + lat + state->delay); + device->schedule(state->completionEvent, + curTick() + lat + state->delay); } delete state; delete pkt->req; diff -r 77ac04d2ba49 -r 309e6662ccde src/mem/bridge.cc --- a/src/mem/bridge.cc Mon Dec 19 13:55:07 2011 +0000 +++ b/src/mem/bridge.cc Mon Dec 19 13:56:02 2011 +0000 @@ -165,7 +165,7 @@ // nothing on the list, add it and we're done if (sendQueue.empty()) { assert(!sendEvent.scheduled()); - schedule(sendEvent, readyTime); + bridge->schedule(sendEvent, readyTime); sendQueue.push_back(buf); return; } @@ -187,7 +187,7 @@ while (i != end && !done) { if (readyTime < (*i)->ready) { if (i == begin) - reschedule(sendEvent, readyTime); + bridge->reschedule(sendEvent, readyTime); sendQueue.insert(i,buf); done = true; } @@ -230,7 +230,7 @@ // should already be an event scheduled for sending the head // packet. if (sendQueue.empty()) { - schedule(sendEvent, readyTime); + bridge->schedule(sendEvent, readyTime); } sendQueue.push_back(buf); } @@ -284,7 +284,7 @@ if (!sendQueue.empty()) { buf = sendQueue.front(); DPRINTF(BusBridge, "Scheduling next send\n"); - schedule(sendEvent, std::max(buf->ready, curTick() + 1)); + bridge->schedule(sendEvent, std::max(buf->ready, curTick() + 1)); } } else { DPRINTF(BusBridge, " unsuccessful\n"); @@ -305,7 +305,7 @@ if (nextReady <= curTick()) trySend(); else - schedule(sendEvent, nextReady); + bridge->schedule(sendEvent, nextReady); } /** Function called by the port when the bus is receiving a Atomic diff -r 77ac04d2ba49 -r 309e6662ccde src/mem/cache/base.cc --- a/src/mem/cache/base.cc Mon Dec 19 13:55:07 2011 +0000 +++ b/src/mem/cache/base.cc Mon Dec 19 13:56:02 2011 +0000 @@ -126,7 +126,7 @@ mustSendRetry = false; SendRetryEvent *ev = new SendRetryEvent(this, true); // @TODO: need to find a better time (next bus cycle?) - schedule(ev, curTick() + 1); + cache->schedule(ev, curTick() + 1); } } diff -r 77ac04d2ba49 -r 309e6662ccde src/mem/cache/cache_impl.hh --- a/src/mem/cache/cache_impl.hh Mon Dec 19 13:55:07 2011 +0000 +++ b/src/mem/cache/cache_impl.hh Mon Dec 19 13:56:02 2011 +0000 @@ -1723,7 +1723,7 @@ // @TODO: need to facotr in prefetch requests here somehow if (nextReady != MaxTick) { DPRINTF(CachePort, "more packets to send @ %d\n", nextReady); - schedule(sendEvent, std::max(nextReady, curTick() + 1)); + cache->schedule(sendEvent, std::max(nextReady, curTick() + 1)); } else { // no more to send right now: if we're draining, we may be done if (drainEvent && !sendEvent->scheduled()) { diff -r 77ac04d2ba49 -r 309e6662ccde src/mem/port.hh --- a/src/mem/port.hh Mon Dec 19 13:55:07 2011 +0000 +++ b/src/mem/port.hh Mon Dec 19 13:56:02 2011 +0000 @@ -47,7 +47,6 @@ #include "base/types.hh" #include "mem/packet.hh" #include "mem/request.hh" -#include "sim/eventq.hh" /** This typedef is used to clean up the parameter list of * getDeviceAddressRanges() and getPeerAddressRanges(). It's declared @@ -59,7 +58,6 @@ typedef std::list > AddrRangeList; typedef std::list >::iterator AddrRangeIter; -class EventQueue; class MemObject; /** @@ -73,7 +71,7 @@ * Send accessor functions are being called from the device the port is * associated with, and it will call the peer recv. accessor function. */ -class Port : public EventManager +class Port { protected: /** Descriptive name (for DPRINTF output) */ diff -r 77ac04d2ba49 -r 309e6662ccde src/mem/port.cc --- a/src/mem/port.cc Mon Dec 19 13:55:07 2011 +0000 +++ b/src/mem/port.cc Mon Dec 19 13:56:02 2011 +0000 @@ -93,8 +93,7 @@ DefaultPeerPort defaultPeerPort; Port::Port(const std::string &_name, MemObject *_owner) - : EventManager(_owner), portName(_name), peer(&defaultPeerPort), - owner(_owner) + : portName(_name), peer(&defaultPeerPort), owner(_owner) { } @@ -113,7 +112,6 @@ void Port::setOwner(MemObject *_owner) { - eventq = _owner->queue(); owner = _owner; } diff -r 77ac04d2ba49 -r 309e6662ccde src/mem/tport.hh --- a/src/mem/tport.hh Mon Dec 19 13:55:07 2011 +0000 +++ b/src/mem/tport.hh Mon Dec 19 13:56:02 2011 +0000 @@ -106,21 +106,14 @@ Tick deferredPacketReadyTime() { return transmitList.empty() ? MaxTick : transmitList.front().tick; } - void - schedSendEvent(Tick when) - { - if (waitingOnRetry) { - assert(!sendEvent->scheduled()); - return; - } - - if (!sendEvent->scheduled()) { - schedule(sendEvent, when); - } else if (sendEvent->when() > when) { - reschedule(sendEvent, when); - } - } - + /** + * Schedule a send even if not already waiting for a retry. If the + * requested time is before an already scheduled send event it + * will be rescheduled. + * + * @param when + */ + void schedSendEvent(Tick when); /** Schedule a sendTiming() event to be called in the future. * @param pkt packet to send diff -r 77ac04d2ba49 -r 309e6662ccde src/mem/tport.cc --- a/src/mem/tport.cc Mon Dec 19 13:55:07 2011 +0000 +++ b/src/mem/tport.cc Mon Dec 19 13:56:02 2011 +0000 @@ -29,12 +29,13 @@ */ #include "debug/Bus.hh" +#include "mem/mem_object.hh" #include "mem/tport.hh" using namespace std; SimpleTimingPort::SimpleTimingPort(string pname, MemObject *_owner) - : Port(pname, _owner), sendEvent(0), drainEvent(NULL), + : Port(pname, _owner), sendEvent(NULL), drainEvent(NULL), waitingOnRetry(false) { sendEvent = new EventWrapperscheduled()); + return; + } + + if (!sendEvent->scheduled()) { + owner->schedule(sendEvent, when); + } else if (sendEvent->when() > when) { + owner->reschedule(sendEvent, when); + } +} void SimpleTimingPort::schedSendTiming(PacketPtr pkt, Tick when) @@ -153,7 +168,7 @@ if (success) { if (!transmitList.empty() && !sendEvent->scheduled()) { Tick time = transmitList.front().tick; - schedule(sendEvent, time <= curTick() ? curTick()+1 : time); + owner->schedule(sendEvent, time <= curTick() ? curTick()+1 : time); } if (transmitList.empty() && drainEvent && !sendEvent->scheduled()) {