dev: Replace EventWrapper use with EventFunctionWrapper
authorSean Wilson <spwilson2@wisc.edu>
Wed, 7 Jun 2017 21:32:15 +0000 (16:32 -0500)
committerSean Wilson <spwilson2@wisc.edu>
Tue, 20 Jun 2017 18:03:21 +0000 (18:03 +0000)
Change-Id: I6b03cc6f67e76dffb79940431711ae6171901c6a
Signed-off-by: Sean Wilson <spwilson2@wisc.edu>
Reviewed-on: https://gem5-review.googlesource.com/3748
Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com>
Maintainer: Andreas Sandberg <andreas.sandberg@arm.com>

19 files changed:
src/dev/arm/ufs_device.cc
src/dev/arm/ufs_device.hh
src/dev/dma_device.cc
src/dev/dma_device.hh
src/dev/net/dist_etherlink.hh
src/dev/net/etherlink.cc
src/dev/net/etherlink.hh
src/dev/net/etherswitch.cc
src/dev/net/etherswitch.hh
src/dev/net/i8254xGBe.cc
src/dev/net/i8254xGBe.hh
src/dev/net/ns_gige.cc
src/dev/net/ns_gige.hh
src/dev/net/sinic.cc
src/dev/net/sinic.hh
src/dev/pci/copy_engine.cc
src/dev/pci/copy_engine.hh
src/dev/storage/ide_disk.cc
src/dev/storage/ide_disk.hh

index 5a5a132155f87b7b84fb6a351df65457b58fa655..cd1bbcafbed399462eed7fbbfe93aef3c4f96990 100644 (file)
@@ -733,8 +733,8 @@ UFSHostDevice::UFSHostDevice(const UFSHostDeviceParams* p) :
     transferTrack(0),
     taskCommandTrack(0),
     idlePhaseStart(0),
-    SCSIResumeEvent(this),
-    UTPEvent(this)
+    SCSIResumeEvent([this]{ SCSIStart(); }, name()),
+    UTPEvent([this]{ finalUTP(); }, name())
 {
     DPRINTF(UFSHostDevice, "The hostcontroller hosts %d Logic units\n",
             lunAvail);
@@ -1280,7 +1280,8 @@ UFSHostDevice::requestHandler()
             task_info.size = size;
             task_info.done = UFSHCIMem.TMUTMRLDBR;
             taskInfo.push_back(task_info);
-            taskEventQueue.push_back(this);
+            taskEventQueue.push_back(
+                EventFunctionWrapper([this]{ taskStart(); }, name()));
             writeDevice(&taskEventQueue.back(), false, address, size,
                         reinterpret_cast<uint8_t*>
                         (&taskInfo.back().destination), 0, 0);
@@ -1328,7 +1329,8 @@ UFSHostDevice::requestHandler()
                 UTPTransferReqDesc;
             DPRINTF(UFSHostDevice, "Initial transfer start: 0x%8x\n",
                     transferstart_info.done);
-            transferEventQueue.push_back(this);
+            transferEventQueue.push_back(
+                EventFunctionWrapper([this]{ transferStart(); }, name()));
 
             if (transferEventQueue.size() < 2) {
                 writeDevice(&transferEventQueue.front(), false,
@@ -2260,7 +2262,8 @@ UFSHostDevice::readCallback()
         UFSDevice[this_lun]->clearReadSignal();
         SSDReadPending.push_back(UFSDevice[this_lun]->SSDReadInfo.front());
         UFSDevice[this_lun]->SSDReadInfo.pop_front();
-        readGarbageEventQueue.push_back(this);
+        readGarbageEventQueue.push_back(
+            EventFunctionWrapper([this]{ readGarbage(); }, name()));
 
         //make sure the queue is popped a the end of the dma transaction
         readDevice(false, SSDReadPending.front().offset,
index 24a05b02233edb523be97261408c39b825540697..69abc27411d10bdd928307b857ce3ae277eeea6d 100644 (file)
@@ -1150,28 +1150,25 @@ class UFSHostDevice : public DmaDevice
     /**
      * Wait for the SCSI specific data to arive
      */
-    EventWrapper<UFSHostDevice, &UFSHostDevice::SCSIStart> SCSIResumeEvent;
+    EventFunctionWrapper SCSIResumeEvent;
 
     /**
      * Wait for the moment where we can send the last frame
      */
-    EventWrapper<UFSHostDevice, &UFSHostDevice::finalUTP> UTPEvent;
+    EventFunctionWrapper UTPEvent;
 
     /**
      * Event after a read to clean up the UTP data structures
      */
-    std::deque<EventWrapper<UFSHostDevice, &UFSHostDevice::readGarbage> >
-    readGarbageEventQueue;
+    std::deque<EventFunctionWrapper> readGarbageEventQueue;
 
     /**
      * Multiple tasks transfers can be scheduled at once for the device, the
      * only thing we know for sure about them is that they will happen in a
      * first come first serve order; hence we need to queue.
      */
-    std::deque<EventWrapper<UFSHostDevice, &UFSHostDevice::taskStart> >
-    taskEventQueue;
-    std::deque<EventWrapper<UFSHostDevice, &UFSHostDevice::transferStart> >
-    transferEventQueue;
+    std::deque<EventFunctionWrapper> taskEventQueue;
+    std::deque<EventFunctionWrapper> transferEventQueue;
 
     /**
      * Bits of interest within UFS data packages
index f84b4c311762d9317e68edfdf5763284d8d84efa..a78819a3e1870a45fce3133c5936dbd228079ab3 100644 (file)
@@ -56,7 +56,8 @@
 DmaPort::DmaPort(MemObject *dev, System *s)
     : MasterPort(dev->name() + ".dma", dev),
       device(dev), sys(s), masterId(s->getMasterId(dev->name())),
-      sendEvent(this), pendingCount(0), inRetry(false)
+      sendEvent([this]{ sendDma(); }, dev->name()),
+      pendingCount(0), inRetry(false)
 { }
 
 void
index 4a1946af5679216857b15462e33c708529ec1753..f354d3859e0bf54e2e80edd0a8a7d4ce5eb8865d 100644 (file)
@@ -123,7 +123,7 @@ class DmaPort : public MasterPort, public Drainable
     std::deque<PacketPtr> transmitList;
 
     /** Event used to schedule a future sending from the transmit list. */
-    EventWrapper<DmaPort, &DmaPort::sendDma> sendEvent;
+    EventFunctionWrapper sendEvent;
 
     /** Number of outstanding packets the dma port has. */
     uint32_t pendingCount;
index e8218941aa465d6bc60c0616f8c88e47da6eacf6..83f28f2b2deafaaee43414bc5efed0a627470fc2 100644 (file)
@@ -118,15 +118,13 @@ class DistEtherLink : public EtherObject
          * Send done callback. Called from doneEvent.
          */
         void txDone();
-        typedef EventWrapper<TxLink, &TxLink::txDone> DoneEvent;
-        friend void DoneEvent::process();
-        DoneEvent doneEvent;
+        EventFunctionWrapper doneEvent;
 
       public:
         TxLink(const std::string &name, DistEtherLink *p,
                double invBW, Tick delay_var, EtherDump *d) :
             Link(name, p, d, &doneEvent), ticksPerByte(invBW),
-            delayVar(delay_var), doneEvent(this) {}
+            delayVar(delay_var), doneEvent([this]{ txDone(); }, name) {}
         ~TxLink() {}
 
         /**
@@ -159,16 +157,14 @@ class DistEtherLink : public EtherObject
          * Receive done callback method. Called from doneEvent.
          */
         void rxDone();
-        typedef EventWrapper<RxLink, &RxLink::rxDone> DoneEvent;
-        friend void DoneEvent::process();
-        DoneEvent _doneEvent;
+        EventFunctionWrapper _doneEvent;
 
       public:
 
         RxLink(const std::string &name, DistEtherLink *p,
                Tick delay, EtherDump *d) :
-            Link(name, p, d, &_doneEvent),
-            linkDelay(delay), _doneEvent(this) {}
+            Link(name, p, d, &_doneEvent), linkDelay(delay),
+            _doneEvent([this]{ rxDone(); }, name) {}
         ~RxLink() {}
 
         /**
@@ -178,7 +174,7 @@ class DistEtherLink : public EtherObject
         /**
          * Done events will be scheduled by DistIface (so we need the accessor)
          */
-        const DoneEvent *doneEvent() const { return &_doneEvent; }
+        const EventFunctionWrapper *doneEvent() const { return &_doneEvent; }
     };
 
     /**
index 0975ba4461ba8e978c660a0aebed5fe446bd8ed9..9a11018bbba4b2368a663c11b2bc6cef3559597c 100644 (file)
@@ -116,7 +116,8 @@ EtherLink::Link::Link(const string &name, EtherLink *p, int num,
                       double rate, Tick delay, Tick delay_var, EtherDump *d)
     : objName(name), parent(p), number(num), txint(NULL), rxint(NULL),
       ticksPerByte(rate), linkDelay(delay), delayVar(delay_var), dump(d),
-      doneEvent(this), txQueueEvent(this)
+      doneEvent([this]{ txDone(); }, name),
+      txQueueEvent([this]{ processTxQueue(); }, name)
 { }
 
 void
index 1d02dec3b0ee28f6ef13a38e05c72049c36e3506..7a9870817ecdf624668173c935b6cc0f69737ca0 100644 (file)
@@ -92,9 +92,7 @@ class EtherLink : public EtherObject
          */
         EthPacketPtr packet;
         void txDone();
-        typedef EventWrapper<Link, &Link::txDone> DoneEvent;
-        friend void DoneEvent::process();
-        DoneEvent doneEvent;
+        EventFunctionWrapper doneEvent;
 
         /**
          * Maintain a queue of in-flight packets. Assume that the
@@ -104,9 +102,7 @@ class EtherLink : public EtherObject
         std::deque<std::pair<Tick, EthPacketPtr>> txQueue;
 
         void processTxQueue();
-        typedef EventWrapper<Link, &Link::processTxQueue> TxQueueEvent;
-        friend void TxQueueEvent::process();
-        TxQueueEvent txQueueEvent;
+        EventFunctionWrapper txQueueEvent;
 
         void txComplete(EthPacketPtr packet);
 
index 995e29a0ceca7799e52dc870bb34f84c4e628741..0e1d6f3aca15a966392329d3753d61c5337d649c 100644 (file)
@@ -131,7 +131,8 @@ EtherSwitch::Interface::Interface(const std::string &name,
                                   Tick delay_var, double rate, unsigned id)
     : EtherInt(name), ticksPerByte(rate), switchDelay(delay),
       delayVar(delay_var), interfaceId(id), parent(etherSwitch),
-      outputFifo(name + ".outputFifo", outputBufferSize), txEvent(this)
+      outputFifo(name + ".outputFifo", outputBufferSize),
+      txEvent([this]{ transmit(); }, name)
 {
 }
 
index debe3319499e0bfe80d2eb32f859e13219adde21..0887d94e5399a9b3e2ba66931bac21667c9a9f6b 100644 (file)
@@ -172,7 +172,7 @@ class EtherSwitch : public EtherObject
          */
         PortFifo outputFifo;
         void transmit();
-        EventWrapper<Interface, &Interface::transmit> txEvent;
+        EventFunctionWrapper txEvent;
     };
 
     struct SwitchTableEntry {
index 74379592a6230826877fd4deaf3f6c7f8776699e..3dde72ac7e3db722c2e0542027d699c12d9bcaa1 100644 (file)
@@ -64,8 +64,12 @@ IGbE::IGbE(const Params *p)
       pktOffset(0), fetchDelay(p->fetch_delay), wbDelay(p->wb_delay),
       fetchCompDelay(p->fetch_comp_delay), wbCompDelay(p->wb_comp_delay),
       rxWriteDelay(p->rx_write_delay), txReadDelay(p->tx_read_delay),
-      rdtrEvent(this), radvEvent(this),
-      tadvEvent(this), tidvEvent(this), tickEvent(this), interEvent(this),
+      rdtrEvent([this]{ rdtrProcess(); }, name()),
+      radvEvent([this]{ radvProcess(); }, name()),
+      tadvEvent([this]{ tadvProcess(); }, name()),
+      tidvEvent([this]{ tidvProcess(); }, name()),
+      tickEvent([this]{ tick(); }, name()),
+      interEvent([this]{ delayIntEvent(); }, name()),
       rxDescCache(this, name()+".RxDesc", p->rx_desc_cache_size),
       txDescCache(this, name()+".TxDesc", p->tx_desc_cache_size),
       lastInterrupt(0)
@@ -825,8 +829,10 @@ template<class T>
 IGbE::DescCache<T>::DescCache(IGbE *i, const std::string n, int s)
     : igbe(i), _name(n), cachePnt(0), size(s), curFetching(0),
       wbOut(0), moreToWb(false), wbAlignment(0), pktPtr(NULL),
-      wbDelayEvent(this), fetchDelayEvent(this), fetchEvent(this),
-      wbEvent(this)
+      wbDelayEvent([this]{ writeback1(); }, n),
+      fetchDelayEvent([this]{ fetchDescriptors1(); }, n),
+      fetchEvent([this]{ fetchComplete(); }, n),
+      wbEvent([this]{ wbComplete(); }, n)
 {
     fetchBuf = new T[size];
     wbBuf = new T[size];
@@ -1197,7 +1203,9 @@ IGbE::DescCache<T>::unserialize(CheckpointIn &cp)
 
 IGbE::RxDescCache::RxDescCache(IGbE *i, const std::string n, int s)
     : DescCache<RxDesc>(i, n, s), pktDone(false), splitCount(0),
-      pktEvent(this), pktHdrEvent(this), pktDataEvent(this)
+    pktEvent([this]{ pktComplete(); }, n),
+    pktHdrEvent([this]{ pktSplitDone(); }, n),
+    pktDataEvent([this]{ pktSplitDone(); }, n)
 
 {
     annSmFetch = "RX Desc Fetch";
@@ -1549,7 +1557,9 @@ IGbE::TxDescCache::TxDescCache(IGbE *i, const std::string n, int s)
       useTso(false), tsoHeaderLen(0), tsoMss(0), tsoTotalLen(0), tsoUsedLen(0),
       tsoPrevSeq(0), tsoPktPayloadBytes(0), tsoLoadedHeader(false),
       tsoPktHasHeader(false), tsoDescBytesUsed(0), tsoCopyBytes(0), tsoPkts(0),
-      pktEvent(this), headerEvent(this), nullEvent(this)
+    pktEvent([this]{ pktComplete(); }, n),
+    headerEvent([this]{ headerComplete(); }, n),
+    nullEvent([this]{ nullCallback(); }, n)
 {
     annSmFetch = "TX Desc Fetch";
     annSmWb = "TX Desc Writeback";
index 80e2104a0b19893dd2e7d47b87b71b03afea8a53..402e61d953031bc8b11f4fc4b1615873c0f4bcb5 100644 (file)
@@ -98,8 +98,7 @@ class IGbE : public EtherDevice
         postInterrupt(iGbReg::IT_RXT);
     }
 
-    //friend class EventWrapper<IGbE, &IGbE::rdtrProcess>;
-    EventWrapper<IGbE, &IGbE::rdtrProcess> rdtrEvent;
+    EventFunctionWrapper rdtrEvent;
 
     // Event and function to deal with RADV timer expiring
     void radvProcess() {
@@ -109,8 +108,7 @@ class IGbE : public EtherDevice
         postInterrupt(iGbReg::IT_RXT);
     }
 
-    //friend class EventWrapper<IGbE, &IGbE::radvProcess>;
-    EventWrapper<IGbE, &IGbE::radvProcess> radvEvent;
+    EventFunctionWrapper radvEvent;
 
     // Event and function to deal with TADV timer expiring
     void tadvProcess() {
@@ -120,8 +118,7 @@ class IGbE : public EtherDevice
         postInterrupt(iGbReg::IT_TXDW);
     }
 
-    //friend class EventWrapper<IGbE, &IGbE::tadvProcess>;
-    EventWrapper<IGbE, &IGbE::tadvProcess> tadvEvent;
+    EventFunctionWrapper tadvEvent;
 
     // Event and function to deal with TIDV timer expiring
     void tidvProcess() {
@@ -130,13 +127,11 @@ class IGbE : public EtherDevice
                 "Posting TXDW interrupt because TIDV timer expired\n");
         postInterrupt(iGbReg::IT_TXDW);
     }
-    //friend class EventWrapper<IGbE, &IGbE::tidvProcess>;
-    EventWrapper<IGbE, &IGbE::tidvProcess> tidvEvent;
+    EventFunctionWrapper tidvEvent;
 
     // Main event to tick the device
     void tick();
-    //friend class EventWrapper<IGbE, &IGbE::tick>;
-    EventWrapper<IGbE, &IGbE::tick> tickEvent;
+    EventFunctionWrapper tickEvent;
 
 
     uint64_t macAddr;
@@ -162,7 +157,7 @@ class IGbE : public EtherDevice
     void delayIntEvent();
     void cpuPostInt();
     // Event to moderate interrupts
-    EventWrapper<IGbE, &IGbE::delayIntEvent> interEvent;
+    EventFunctionWrapper interEvent;
 
     /** Clear the interupt line to the cpu
      */
@@ -284,24 +279,24 @@ class IGbE : public EtherDevice
 
         void writeback(Addr aMask);
         void writeback1();
-        EventWrapper<DescCache, &DescCache::writeback1> wbDelayEvent;
+        EventFunctionWrapper wbDelayEvent;
 
         /** Fetch a chunk of descriptors into the descriptor cache.
          * Calls fetchComplete when the memory system returns the data
          */
         void fetchDescriptors();
         void fetchDescriptors1();
-        EventWrapper<DescCache, &DescCache::fetchDescriptors1> fetchDelayEvent;
+        EventFunctionWrapper fetchDelayEvent;
 
         /** Called by event when dma to read descriptors is completed
          */
         void fetchComplete();
-        EventWrapper<DescCache, &DescCache::fetchComplete> fetchEvent;
+        EventFunctionWrapper fetchEvent;
 
         /** Called by event when dma to writeback descriptors is completed
          */
         void wbComplete();
-        EventWrapper<DescCache, &DescCache::wbComplete> wbEvent;
+        EventFunctionWrapper wbEvent;
 
         /* Return the number of descriptors left in the ring, so the device has
          * a way to figure out if it needs to interrupt.
@@ -384,13 +379,13 @@ class IGbE : public EtherDevice
          */
         bool packetDone();
 
-        EventWrapper<RxDescCache, &RxDescCache::pktComplete> pktEvent;
+        EventFunctionWrapper pktEvent;
 
         // Event to handle issuing header and data write at the same time
         // and only callking pktComplete() when both are completed
         void pktSplitDone();
-        EventWrapper<RxDescCache, &RxDescCache::pktSplitDone> pktHdrEvent;
-        EventWrapper<RxDescCache, &RxDescCache::pktSplitDone> pktDataEvent;
+        EventFunctionWrapper pktHdrEvent;
+        EventFunctionWrapper pktDataEvent;
 
         bool hasOutstandingEvents() override;
 
@@ -484,10 +479,10 @@ class IGbE : public EtherDevice
         /** Called by event when dma to write packet is completed
          */
         void pktComplete();
-        EventWrapper<TxDescCache, &TxDescCache::pktComplete> pktEvent;
+        EventFunctionWrapper pktEvent;
 
         void headerComplete();
-        EventWrapper<TxDescCache, &TxDescCache::headerComplete> headerEvent;
+        EventFunctionWrapper headerEvent;
 
 
         void completionWriteback(Addr a, bool enabled) {
@@ -503,7 +498,7 @@ class IGbE : public EtherDevice
         void nullCallback() {
             DPRINTF(EthernetDesc, "Completion writeback complete\n");
         }
-        EventWrapper<TxDescCache, &TxDescCache::nullCallback> nullEvent;
+        EventFunctionWrapper nullEvent;
 
         void serialize(CheckpointOut &cp) const override;
         void unserialize(CheckpointIn &cp) override;
index 50bb6ed17ea99eb3e4ded5fa2af47c1b891504de..dbed29f8b066fc004b206d1d8973f853e9d272c6 100644 (file)
@@ -111,12 +111,18 @@ NSGigE::NSGigE(Params *p)
       dmaReadFactor(p->dma_read_factor), dmaWriteFactor(p->dma_write_factor),
       rxDmaData(NULL), rxDmaAddr(0), rxDmaLen(0),
       txDmaData(NULL), txDmaAddr(0), txDmaLen(0),
-      rxDmaReadEvent(this), rxDmaWriteEvent(this),
-      txDmaReadEvent(this), txDmaWriteEvent(this),
+      rxDmaReadEvent([this]{ rxDmaReadDone(); }, name()),
+      rxDmaWriteEvent([this]{ rxDmaWriteDone(); }, name()),
+      txDmaReadEvent([this]{ txDmaReadDone(); }, name()),
+      txDmaWriteEvent([this]{ txDmaWriteDone(); }, name()),
       dmaDescFree(p->dma_desc_free), dmaDataFree(p->dma_data_free),
       txDelay(p->tx_delay), rxDelay(p->rx_delay),
-      rxKickTick(0), rxKickEvent(this), txKickTick(0), txKickEvent(this),
-      txEvent(this), rxFilterEnable(p->rx_filter),
+      rxKickTick(0),
+      rxKickEvent([this]{ rxKick(); }, name()),
+      txKickTick(0),
+      txKickEvent([this]{ txKick(); }, name()),
+      txEvent([this]{ txEventTransmit(); }, name()),
+      rxFilterEnable(p->rx_filter),
       acceptBroadcast(false), acceptMulticast(false), acceptUnicast(false),
       acceptPerfect(false), acceptArp(false), multicastHashEnable(false),
       intrDelay(p->intr_delay), intrTick(0), cpuPendingIntr(false),
@@ -959,7 +965,9 @@ NSGigE::cpuIntrPost(Tick when)
 
     if (intrEvent)
         intrEvent->squash();
-    intrEvent = new IntrEvent(this, true);
+
+    intrEvent = new EventFunctionWrapper([this]{ cpuInterrupt(); },
+                                         name(), true);
     schedule(intrEvent, intrTick);
 }
 
@@ -2470,7 +2478,8 @@ NSGigE::unserialize(CheckpointIn &cp)
     Tick intrEventTick;
     UNSERIALIZE_SCALAR(intrEventTick);
     if (intrEventTick) {
-        intrEvent = new IntrEvent(this, true);
+        intrEvent = new EventFunctionWrapper([this]{ cpuInterrupt(); },
+                                             name(), true);
         schedule(intrEvent, intrEventTick);
     }
 }
index 096b2b69e63b2a2105c0c7708adc6870041bc82d..f9be02890d11e930d80b34927fd51715abbc1ac0 100644 (file)
@@ -256,20 +256,16 @@ class NSGigE : public EtherDevBase
     bool  doTxDmaWrite();
 
     void rxDmaReadDone();
-    friend class EventWrapper<NSGigE, &NSGigE::rxDmaReadDone>;
-    EventWrapper<NSGigE, &NSGigE::rxDmaReadDone> rxDmaReadEvent;
+    EventFunctionWrapper rxDmaReadEvent;
 
     void rxDmaWriteDone();
-    friend class EventWrapper<NSGigE, &NSGigE::rxDmaWriteDone>;
-    EventWrapper<NSGigE, &NSGigE::rxDmaWriteDone> rxDmaWriteEvent;
+    EventFunctionWrapper rxDmaWriteEvent;
 
     void txDmaReadDone();
-    friend class EventWrapper<NSGigE, &NSGigE::txDmaReadDone>;
-    EventWrapper<NSGigE, &NSGigE::txDmaReadDone> txDmaReadEvent;
+    EventFunctionWrapper txDmaReadEvent;
 
     void txDmaWriteDone();
-    friend class EventWrapper<NSGigE, &NSGigE::txDmaWriteDone>;
-    EventWrapper<NSGigE, &NSGigE::txDmaWriteDone> txDmaWriteEvent;
+    EventFunctionWrapper txDmaWriteEvent;
 
     bool dmaDescFree;
     bool dmaDataFree;
@@ -284,15 +280,11 @@ class NSGigE : public EtherDevBase
 
     void rxKick();
     Tick rxKickTick;
-    typedef EventWrapper<NSGigE, &NSGigE::rxKick> RxKickEvent;
-    friend void RxKickEvent::process();
-    RxKickEvent rxKickEvent;
+    EventFunctionWrapper rxKickEvent;
 
     void txKick();
     Tick txKickTick;
-    typedef EventWrapper<NSGigE, &NSGigE::txKick> TxKickEvent;
-    friend void TxKickEvent::process();
-    TxKickEvent txKickEvent;
+    EventFunctionWrapper txKickEvent;
 
     void eepromKick();
 
@@ -306,9 +298,7 @@ class NSGigE : public EtherDevBase
         if (txState == txFifoBlock)
             txKick();
     }
-    typedef EventWrapper<NSGigE, &NSGigE::txEventTransmit> TxEvent;
-    friend void TxEvent::process();
-    TxEvent txEvent;
+    EventFunctionWrapper txEvent;
 
     void txDump() const;
     void rxDump() const;
@@ -339,9 +329,7 @@ class NSGigE : public EtherDevBase
     void cpuInterrupt();
     void cpuIntrClear();
 
-    typedef EventWrapper<NSGigE, &NSGigE::cpuInterrupt> IntrEvent;
-    friend void IntrEvent::process();
-    IntrEvent *intrEvent;
+    EventFunctionWrapper *intrEvent;
     NSGigEInt *interface;
 
   public:
index e86e1abe26d3b4e7ddd9e132743efde687342f3a..50341a4d31453a3b64b06474997eb33eee74c0f5 100644 (file)
@@ -91,7 +91,9 @@ Device::Device(const Params *p)
       virtualRegs(p->virtual_count < 1 ? 1 : p->virtual_count),
       rxFifo(p->rx_fifo_size), txFifo(p->tx_fifo_size),
       rxKickTick(0), txKickTick(0),
-      txEvent(this), rxDmaEvent(this), txDmaEvent(this),
+      txEvent([this]{ txEventTransmit(); }, name()),
+      rxDmaEvent([this]{ rxDmaDone(); }, name()),
+      txDmaEvent([this]{ txDmaDone(); }, name()),
       dmaReadDelay(p->dma_read_delay), dmaReadFactor(p->dma_read_factor),
       dmaWriteDelay(p->dma_write_delay), dmaWriteFactor(p->dma_write_factor)
 {
@@ -535,7 +537,9 @@ Base::cpuIntrPost(Tick when)
 
     if (intrEvent)
         intrEvent->squash();
-    intrEvent = new IntrEvent(this, true);
+
+    intrEvent = new EventFunctionWrapper([this]{ cpuInterrupt(); },
+                                         name(), true);
     schedule(intrEvent, intrTick);
 }
 
@@ -1297,7 +1301,8 @@ Base::unserialize(CheckpointIn &cp)
     Tick intrEventTick;
     UNSERIALIZE_SCALAR(intrEventTick);
     if (intrEventTick) {
-        intrEvent = new IntrEvent(this, true);
+        intrEvent = new EventFunctionWrapper([this]{ cpuInterrupt(); },
+                                             name(), true);
         schedule(intrEvent, intrEventTick);
     }
 }
index b041cb16d63a3e2f2dbbe235b1922e4a1027d463..70d22f12d8b61e8084357188d89a20da49942a2d 100644 (file)
@@ -61,9 +61,7 @@ class Base : public EtherDevBase
     void cpuInterrupt();
     void cpuIntrClear();
 
-    typedef EventWrapper<Base, &Base::cpuInterrupt> IntrEvent;
-    friend void IntrEvent::process();
-    IntrEvent *intrEvent;
+    EventFunctionWrapper *intrEvent;
     Interface *interface;
 
     bool cpuIntrPending() const;
@@ -196,13 +194,9 @@ class Device : public Base
 
     void rxKick();
     Tick rxKickTick;
-    typedef EventWrapper<Device, &Device::rxKick> RxKickEvent;
-    friend void RxKickEvent::process();
 
     void txKick();
     Tick txKickTick;
-    typedef EventWrapper<Device, &Device::txKick> TxKickEvent;
-    friend void TxKickEvent::process();
 
     /**
      * Retransmit event
@@ -214,9 +208,7 @@ class Device : public Base
         if (txState == txFifoBlock)
             txKick();
     }
-    typedef EventWrapper<Device, &Device::txEventTransmit> TxEvent;
-    friend void TxEvent::process();
-    TxEvent txEvent;
+    EventFunctionWrapper txEvent;
 
     void txDump() const;
     void rxDump() const;
@@ -245,12 +237,10 @@ class Device : public Base
  */
   protected:
     void rxDmaDone();
-    friend class EventWrapper<Device, &Device::rxDmaDone>;
-    EventWrapper<Device, &Device::rxDmaDone> rxDmaEvent;
+    EventFunctionWrapper rxDmaEvent;
 
     void txDmaDone();
-    friend class EventWrapper<Device, &Device::txDmaDone>;
-    EventWrapper<Device, &Device::txDmaDone> txDmaEvent;
+    EventFunctionWrapper txDmaEvent;
 
     Tick dmaReadDelay;
     Tick dmaReadFactor;
index 326c51d117dedfbfc5b9ebf08a673f872100cd69..3c7df7d3abed01dd54feab2764b502b36e0fc4fe 100644 (file)
@@ -81,12 +81,14 @@ CopyEngine::CopyEngine(const Params *p)
 CopyEngine::CopyEngineChannel::CopyEngineChannel(CopyEngine *_ce, int cid)
     : cePort(_ce, _ce->sys),
       ce(_ce), channelId(cid), busy(false), underReset(false),
-    refreshNext(false), latBeforeBegin(ce->params()->latBeforeBegin),
-    latAfterCompletion(ce->params()->latAfterCompletion),
-    completionDataReg(0), nextState(Idle),
-    fetchCompleteEvent(this), addrCompleteEvent(this),
-    readCompleteEvent(this), writeCompleteEvent(this),
-    statusCompleteEvent(this)
+      refreshNext(false), latBeforeBegin(ce->params()->latBeforeBegin),
+      latAfterCompletion(ce->params()->latAfterCompletion),
+      completionDataReg(0), nextState(Idle),
+      fetchCompleteEvent([this]{ fetchDescComplete(); }, name()),
+      addrCompleteEvent([this]{ fetchAddrComplete(); }, name()),
+      readCompleteEvent([this]{ readCopyBytesComplete(); }, name()),
+      writeCompleteEvent([this]{ writeCopyBytesComplete(); }, name()),
+      statusCompleteEvent([this]{ writeStatusComplete(); }, name())
 
 {
         cr.status.dma_transfer_status(3);
index f548c478bfada00bd2b21088d0311ab20050b861..1ec29f02e8defd8e37b4c38ecaecdc2e33182fce 100644 (file)
@@ -115,28 +115,23 @@ class CopyEngine : public PciDevice
       private:
         void fetchDescriptor(Addr address);
         void fetchDescComplete();
-        EventWrapper<CopyEngineChannel, &CopyEngineChannel::fetchDescComplete>
-            fetchCompleteEvent;
+        EventFunctionWrapper fetchCompleteEvent;
 
         void fetchNextAddr(Addr address);
         void fetchAddrComplete();
-        EventWrapper<CopyEngineChannel, &CopyEngineChannel::fetchAddrComplete>
-            addrCompleteEvent;
+        EventFunctionWrapper addrCompleteEvent;
 
         void readCopyBytes();
         void readCopyBytesComplete();
-        EventWrapper<CopyEngineChannel, &CopyEngineChannel::readCopyBytesComplete>
-            readCompleteEvent;
+        EventFunctionWrapper readCompleteEvent;
 
         void writeCopyBytes();
         void writeCopyBytesComplete();
-        EventWrapper <CopyEngineChannel, &CopyEngineChannel::writeCopyBytesComplete>
-            writeCompleteEvent;
+        EventFunctionWrapper writeCompleteEvent;
 
         void writeCompletionStatus();
         void writeStatusComplete();
-        EventWrapper <CopyEngineChannel, &CopyEngineChannel::writeStatusComplete>
-            statusCompleteEvent;
+        EventFunctionWrapper statusCompleteEvent;
 
 
         void continueProcessing();
index de0986e458d9eebb892a712c80d87559e2c1c7aa..08d374fa392da6bff270f9d4f1332f37cfdd5ffe 100644 (file)
@@ -68,9 +68,14 @@ using namespace TheISA;
 
 IdeDisk::IdeDisk(const Params *p)
     : SimObject(p), ctrl(NULL), image(p->image), diskDelay(p->delay),
-      dmaTransferEvent(this), dmaReadCG(NULL), dmaReadWaitEvent(this),
-      dmaWriteCG(NULL), dmaWriteWaitEvent(this), dmaPrdReadEvent(this),
-      dmaReadEvent(this), dmaWriteEvent(this)
+      dmaTransferEvent([this]{ doDmaTransfer(); }, name()),
+      dmaReadCG(NULL),
+      dmaReadWaitEvent([this]{ doDmaRead(); }, name()),
+      dmaWriteCG(NULL),
+      dmaWriteWaitEvent([this]{ doDmaWrite(); }, name()),
+      dmaPrdReadEvent([this]{ dmaPrdReadDone(); }, name()),
+      dmaReadEvent([this]{ dmaReadDone(); }, name()),
+      dmaWriteEvent([this]{ dmaWriteDone(); }, name())
 {
     // Reset the device state
     reset(p->driveID);
index 9214599e988e82918fdead0b49088ed4c0c40dec..fa5bb760de1694e946908acff3e56a08be5d4865 100644 (file)
@@ -306,34 +306,28 @@ class IdeDisk : public SimObject
 
     // DMA stuff
     void doDmaTransfer();
-    friend class EventWrapper<IdeDisk, &IdeDisk::doDmaTransfer>;
-    EventWrapper<IdeDisk, &IdeDisk::doDmaTransfer> dmaTransferEvent;
+    EventFunctionWrapper dmaTransferEvent;
 
     void doDmaDataRead();
 
     void doDmaRead();
     ChunkGenerator *dmaReadCG;
-    friend class EventWrapper<IdeDisk, &IdeDisk::doDmaRead>;
-    EventWrapper<IdeDisk, &IdeDisk::doDmaRead> dmaReadWaitEvent;
+    EventFunctionWrapper dmaReadWaitEvent;
 
     void doDmaDataWrite();
 
     void doDmaWrite();
     ChunkGenerator *dmaWriteCG;
-    friend class EventWrapper<IdeDisk, &IdeDisk::doDmaWrite>;
-    EventWrapper<IdeDisk, &IdeDisk::doDmaWrite> dmaWriteWaitEvent;
+    EventFunctionWrapper dmaWriteWaitEvent;
 
     void dmaPrdReadDone();
-    friend class EventWrapper<IdeDisk, &IdeDisk::dmaPrdReadDone>;
-    EventWrapper<IdeDisk, &IdeDisk::dmaPrdReadDone> dmaPrdReadEvent;
+    EventFunctionWrapper dmaPrdReadEvent;
 
     void dmaReadDone();
-    friend class EventWrapper<IdeDisk, &IdeDisk::dmaReadDone>;
-    EventWrapper<IdeDisk, &IdeDisk::dmaReadDone> dmaReadEvent;
+    EventFunctionWrapper dmaReadEvent;
 
     void dmaWriteDone();
-    friend class EventWrapper<IdeDisk, &IdeDisk::dmaWriteDone>;
-    EventWrapper<IdeDisk, &IdeDisk::dmaWriteDone> dmaWriteEvent;
+    EventFunctionWrapper dmaWriteEvent;
 
     // Disk image read/write
     void readDisk(uint32_t sector, uint8_t *data);