inorder-resources: delete events
authorKorey Sewell <ksewell@umich.edu>
Tue, 12 May 2009 19:01:16 +0000 (15:01 -0400)
committerKorey Sewell <ksewell@umich.edu>
Tue, 12 May 2009 19:01:16 +0000 (15:01 -0400)
make sure unrecognized events in the resource pool are deleted and also delete resource events in destructor

src/cpu/inorder/resource.cc
src/cpu/inorder/resource.hh
src/cpu/inorder/resource_pool.cc
src/cpu/inorder/resource_pool.hh

index d8fefe0c9abd8a32a46960629beecd95bc63c020..49afefd9822e7039b6d2c40e71de8845c778d6b8 100644 (file)
@@ -44,6 +44,12 @@ Resource::Resource(string res_name, int res_id, int res_width,
     deniedReq = new ResourceRequest(this, NULL, 0, 0, 0, 0);
 }
 
+Resource::~Resource()
+{
+    delete [] resourceEvent;
+}
+
+
 void
 Resource::init()
 {
index 71270241f664268c98e32c446096fe841314b322..5b49771584f96de0647e6602b50fccbb85811e0a 100644 (file)
@@ -60,7 +60,8 @@ class Resource {
   public:
     Resource(std::string res_name, int res_id, int res_width,
              int res_latency, InOrderCPU *_cpu);
-    virtual ~Resource() {}
+    virtual ~Resource();
+
 
     /** Return name of this resource */
     virtual std::string name();
index 5cb55b89b3cbd7f3924e6e31824bfafc83b9e44c..7bcf2585b56e4f69379a103916343774f9a24db0 100644 (file)
@@ -187,19 +187,18 @@ ResourcePool::scheduleEvent(InOrderCPU::CPUEventType e_type, DynInstPtr inst,
 {
     assert(delay >= 0);
 
-    ResPoolEvent *res_pool_event = new ResPoolEvent(this);
-
     switch (e_type)
     {
       case InOrderCPU::ActivateThread:
         {
             DPRINTF(Resource, "Scheduling Activate Thread Resource Pool Event for tick %i.\n",
                     curTick + delay);
-            res_pool_event->setEvent(e_type,
-                                     inst,
-                                     inst->squashingStage,
-                                     inst->bdelaySeqNum,
-                                     inst->readTid());
+            ResPoolEvent *res_pool_event = new ResPoolEvent(this,
+                                                            e_type,
+                                                            inst,
+                                                            inst->squashingStage,
+                                                            inst->bdelaySeqNum,
+                                                            inst->readTid());
             mainEventQueue.schedule(res_pool_event, curTick + cpu->ticks(delay));
         }
         break;
@@ -207,14 +206,15 @@ ResourcePool::scheduleEvent(InOrderCPU::CPUEventType e_type, DynInstPtr inst,
       case InOrderCPU::SuspendThread:
       case InOrderCPU::DeallocateThread:
         {
+
             DPRINTF(Resource, "Scheduling Deactivate Thread Resource Pool Event for tick %i.\n",
                     curTick + delay);
-
-            res_pool_event->setEvent(e_type,
-                                     inst,
-                                     inst->squashingStage,
-                                     inst->bdelaySeqNum,
-                                     tid);
+            ResPoolEvent *res_pool_event = new ResPoolEvent(this,
+                                                            e_type,
+                                                            inst,
+                                                            inst->squashingStage,
+                                                            inst->bdelaySeqNum,
+                                                            tid);
 
             mainEventQueue.schedule(res_pool_event, curTick + cpu->ticks(delay));
 
@@ -225,12 +225,11 @@ ResourcePool::scheduleEvent(InOrderCPU::CPUEventType e_type, DynInstPtr inst,
         {
             DPRINTF(Resource, "Scheduling Inst-Graduated Resource Pool Event for tick %i.\n",
                     curTick + delay);
-
-            res_pool_event->setEvent(e_type,
-                                     inst,
-                                     inst->squashingStage,
-                                     inst->seqNum,
-                                     inst->readTid());
+            ResPoolEvent *res_pool_event = new ResPoolEvent(this,e_type,
+                                                            inst,
+                                                            inst->squashingStage,
+                                                            inst->seqNum,
+                                                            inst->readTid());
             mainEventQueue.schedule(res_pool_event, curTick + cpu->ticks(delay));
 
         }
@@ -240,13 +239,12 @@ ResourcePool::scheduleEvent(InOrderCPU::CPUEventType e_type, DynInstPtr inst,
         {
             DPRINTF(Resource, "Scheduling Squash Resource Pool Event for tick %i.\n",
                     curTick + delay);
-            res_pool_event->setEvent(e_type,
-                                     inst,
-                                     inst->squashingStage,
-                                     inst->bdelaySeqNum,
-                                     inst->readTid());
+            ResPoolEvent *res_pool_event = new ResPoolEvent(this,e_type,
+                                                            inst,
+                                                            inst->squashingStage,
+                                                            inst->bdelaySeqNum,
+                                                            inst->readTid());
             mainEventQueue.schedule(res_pool_event, curTick + cpu->ticks(delay));
-
         }
         break;
 
@@ -315,9 +313,21 @@ ResourcePool::instGraduated(InstSeqNum seq_num,unsigned tid)
 }
 
 ResourcePool::ResPoolEvent::ResPoolEvent(ResourcePool *_resPool)
-    : Event(CPU_Tick_Pri),
-      resPool(_resPool)
-{ eventType = (InOrderCPU::CPUEventType) Default; }
+    : Event(CPU_Tick_Pri), resPool(_resPool),
+      eventType((InOrderCPU::CPUEventType) Default)
+{ }
+
+ResourcePool::ResPoolEvent::ResPoolEvent(ResourcePool *_resPool,
+                                         InOrderCPU::CPUEventType e_type,
+                                         DynInstPtr _inst,
+                                         int stage_num,
+                                         InstSeqNum seq_num,
+                                         unsigned _tid)
+    : Event(CPU_Tick_Pri), resPool(_resPool),
+      eventType(e_type), inst(_inst), seqNum(seq_num),
+      stageNum(stage_num), tid(_tid)
+{ }
+
 
 void
 ResourcePool::ResPoolEvent::process()
index 6cc1f77e6a00e487d46ccc96eb1ba87563f94727..42a07390c4a548d6d896ba19c7705c021cf6557d 100644 (file)
@@ -87,6 +87,14 @@ class ResourcePool {
         /** Constructs a resource event. */
         ResPoolEvent(ResourcePool *_resPool);
 
+        /** Constructs a resource event. */
+        ResPoolEvent(ResourcePool *_resPool,
+                     InOrderCPU::CPUEventType e_type,
+                     DynInstPtr _inst,
+                     int stage_num,
+                     InstSeqNum seq_num,
+                     unsigned _tid);
+
         /** Set Type of Event To Be Scheduled */
         void setEvent(InOrderCPU::CPUEventType e_type,
                       DynInstPtr _inst,