changeset 2c841ed4355e in /z/repo/m5
details: http://repo.m5sim.org/m5?cmd=changeset;node=2c841ed4355e
description:
        inorder: cleanup in destructors
        cleanup hanging pointers and other cruft in the destructors

diffstat:

 src/cpu/inorder/cpu.cc            |  13 ++++++++++++-
 src/cpu/inorder/cpu.hh            |   1 +
 src/cpu/inorder/pipeline_stage.cc |  20 ++++++++++++++------
 src/cpu/inorder/pipeline_stage.hh |  15 +--------------
 src/cpu/inorder/reg_dep_map.cc    |   8 ++++++++
 src/cpu/inorder/reg_dep_map.hh    |   2 +-
 src/cpu/inorder/resource.cc       |   7 ++++++-
 7 files changed, 43 insertions(+), 23 deletions(-)

diffs (174 lines):

diff -r 5a0ba3f96300 -r 2c841ed4355e src/cpu/inorder/cpu.cc
--- a/src/cpu/inorder/cpu.cc    Fri Feb 18 14:29:17 2011 -0500
+++ b/src/cpu/inorder/cpu.cc    Fri Feb 18 14:29:26 2011 -0500
@@ -356,6 +356,17 @@
 InOrderCPU::~InOrderCPU()
 {
     delete resPool;
+
+    std::map<SkedID, ThePipeline::RSkedPtr>::iterator sked_it =
+        skedCache.begin();
+    std::map<SkedID, ThePipeline::RSkedPtr>::iterator sked_end =
+        skedCache.end();
+
+    while (sked_it != sked_end) {
+        delete (*sked_it).second;
+        sked_it++;
+    }
+    skedCache.clear();
 }
 
 std::map<InOrderCPU::SkedID, ThePipeline::RSkedPtr> InOrderCPU::skedCache;
@@ -460,7 +471,7 @@
 
     W.needs(Grad, GraduationUnit::GraduateInst);
 
-    // Insert Front Schedule into our cache of
+    // Insert Back Schedule into our cache of
     // resource schedules
     addToSkedCache(inst, res_sked);
 
diff -r 5a0ba3f96300 -r 2c841ed4355e src/cpu/inorder/cpu.hh
--- a/src/cpu/inorder/cpu.hh    Fri Feb 18 14:29:17 2011 -0500
+++ b/src/cpu/inorder/cpu.hh    Fri Feb 18 14:29:26 2011 -0500
@@ -315,6 +315,7 @@
     void addToSkedCache(DynInstPtr inst, ThePipeline::RSkedPtr inst_sked)
     {
         SkedID sked_id = genSkedID(inst);
+        assert(skedCache.find(sked_id) == skedCache.end());
         skedCache[sked_id] = inst_sked;
     }
 
diff -r 5a0ba3f96300 -r 2c841ed4355e src/cpu/inorder/pipeline_stage.cc
--- a/src/cpu/inorder/pipeline_stage.cc Fri Feb 18 14:29:17 2011 -0500
+++ b/src/cpu/inorder/pipeline_stage.cc Fri Feb 18 14:29:26 2011 -0500
@@ -44,12 +44,17 @@
       stageBufferMax(params->stageWidth),
       prevStageValid(false), nextStageValid(false), idle(false)
 {
-    switchedOutBuffer.resize(ThePipeline::MaxThreads);
-    switchedOutValid.resize(ThePipeline::MaxThreads);
-    
     init(params);
 }
 
+PipelineStage::~PipelineStage()
+{
+   for(ThreadID tid = 0; tid < numThreads; tid++) {
+       skidBuffer[tid].clear();
+       stalls[tid].resources.clear();
+   }
+}
+
 void
 PipelineStage::init(Params *params)
 {
@@ -66,6 +71,12 @@
         else
             lastStallingStage[tid] = NumStages - 1;
     }
+
+    if ((InOrderCPU::ThreadModel) params->threadModel ==
+        InOrderCPU::SwitchOnCacheMiss) {
+        switchedOutBuffer.resize(ThePipeline::MaxThreads);
+        switchedOutValid.resize(ThePipeline::MaxThreads);
+    }
 }
 
 
@@ -190,9 +201,6 @@
 
         stalls[tid].resources.clear();
 
-        while (!insts[tid].empty())
-            insts[tid].pop();
-
         skidBuffer[tid].clear();
     }
     wroteToTimeBuffer = false;
diff -r 5a0ba3f96300 -r 2c841ed4355e src/cpu/inorder/pipeline_stage.hh
--- a/src/cpu/inorder/pipeline_stage.hh Fri Feb 18 14:29:17 2011 -0500
+++ b/src/cpu/inorder/pipeline_stage.hh Fri Feb 18 14:29:26 2011 -0500
@@ -91,10 +91,7 @@
   public:
     PipelineStage(Params *params, unsigned stage_num);
 
-    /** MUST use init() function if this constructor is used. */
-    PipelineStage() { }
-
-    virtual ~PipelineStage() { }
+    virtual ~PipelineStage();
 
     /** PipelineStage initialization. */
     void init(Params *params);
@@ -268,16 +265,6 @@
      */
     unsigned instsProcessed;    
 
-    /** Queue of all instructions coming from previous stage on this cycle. */
-    std::queue<DynInstPtr> insts[ThePipeline::MaxThreads];
-
-    /** Queue of instructions that are finished processing and ready to go 
-     *  next stage. This is used to prevent from processing an instrution more 
-     *  than once on any stage. NOTE: It is up to the PROGRAMMER must manage 
-     *  this as a queue
-     */
-    std::list<DynInstPtr> instsToNextStage;
-
     /** Skid buffer between previous stage and this one. */
     std::list<DynInstPtr> skidBuffer[ThePipeline::MaxThreads];
 
diff -r 5a0ba3f96300 -r 2c841ed4355e src/cpu/inorder/reg_dep_map.cc
--- a/src/cpu/inorder/reg_dep_map.cc    Fri Feb 18 14:29:17 2011 -0500
+++ b/src/cpu/inorder/reg_dep_map.cc    Fri Feb 18 14:29:26 2011 -0500
@@ -45,6 +45,14 @@
     regMap.resize(size);
 }
 
+RegDepMap::~RegDepMap()
+{
+    for (int i = 0; i < regMap.size(); i++) {
+        regMap[i].clear();
+    }
+    regMap.clear();
+}
+
 string
 RegDepMap::name()
 {
diff -r 5a0ba3f96300 -r 2c841ed4355e src/cpu/inorder/reg_dep_map.hh
--- a/src/cpu/inorder/reg_dep_map.hh    Fri Feb 18 14:29:17 2011 -0500
+++ b/src/cpu/inorder/reg_dep_map.hh    Fri Feb 18 14:29:26 2011 -0500
@@ -48,7 +48,7 @@
   public:
     RegDepMap(int size = TheISA::TotalNumRegs);
 
-    ~RegDepMap() { }
+    ~RegDepMap();
 
     std::string name();
 
diff -r 5a0ba3f96300 -r 2c841ed4355e src/cpu/inorder/resource.cc
--- a/src/cpu/inorder/resource.cc       Fri Feb 18 14:29:17 2011 -0500
+++ b/src/cpu/inorder/resource.cc       Fri Feb 18 14:29:26 2011 -0500
@@ -53,7 +53,11 @@
         delete [] resourceEvent;
     }
 
-    delete deniedReq;    
+    delete deniedReq;
+
+    for (int i = 0; i < width; i++) {
+        delete reqs[i];
+    }
 }
 
 
@@ -386,6 +390,7 @@
         DPRINTF(ResReqCount, "Res. Req %i deleted. resReqCount=%i.\n", reqID, 
                 res->cpu->resReqCount);
 #endif
+        inst = NULL;
 }
 
 void
_______________________________________________
m5-dev mailing list
m5-dev@m5sim.org
http://m5sim.org/mailman/listinfo/m5-dev

Reply via email to