Add explicit phases to order ParamContext initializations.
authorSteve Reinhardt <stever@eecs.umich.edu>
Mon, 25 Oct 2004 04:56:47 +0000 (00:56 -0400)
committerSteve Reinhardt <stever@eecs.umich.edu>
Mon, 25 Oct 2004 04:56:47 +0000 (00:56 -0400)
--HG--
extra : convert_revision : c24fba2bded2493a892fa93de0c61f9674cfedbb

sim/builder.cc
sim/param.cc
sim/param.hh
sim/universe.cc

index 890451ec491f1d6ac6503ede3f324b05d0073cf2..fa5c113a796bd8f1c1bcde045a4bebae63cb8d73 100644 (file)
@@ -43,7 +43,7 @@ SimObjectBuilder::SimObjectBuilder(const string &_configClass,
                                    const string &_instanceName,
                                    ConfigNode *_configNode,
                                    const string &_simObjClassName)
-    : ParamContext(_configClass, true),
+    : ParamContext(_configClass, NoAutoInit),
       instanceName(_instanceName),
       configNode(_configNode),
       simObjClassName(_simObjClassName)
index 84ecbf8f96b4fcab1176d4987c9cf7b66fa93a64..d20be8d3358bf215108fc2978714e29ce47b0da6 100644 (file)
@@ -560,15 +560,27 @@ SimObjectBaseParam::parse(const string &s, vector<SimObject *>&value)
 
 list<ParamContext *> *ParamContext::ctxList = NULL;
 
-ParamContext::ParamContext(const string &_iniSection, bool noAutoParse)
+ParamContext::ParamContext(const string &_iniSection, InitPhase _initPhase)
     : iniFilePtr(NULL),        // initialized on call to parseParams()
-      iniSection(_iniSection), paramList(NULL)
+      iniSection(_iniSection), paramList(NULL),
+      initPhase(_initPhase)
 {
-    if (!noAutoParse) {
+    // Put this context on global list for initialization
+    if (initPhase != NoAutoInit) {
         if (ctxList == NULL)
             ctxList = new list<ParamContext *>();
 
-        (*ctxList).push_back(this);
+        // keep list sorted by ascending initPhase values
+        list<ParamContext *>::iterator i = ctxList->begin();
+        list<ParamContext *>::iterator end = ctxList->end();
+        for (; i != end; ++i) {
+            if (initPhase <= (*i)->initPhase) {
+                // found where we want to insert
+                break;
+            }
+        }
+        // (fall through case: insert at end)
+        ctxList->insert(i, this);
     }
 }
 
index fe13edc48d1aba6c30bd2786a82a9f93a9a63d6c..6706820c258048f57538360bafb9c7ad25d26074 100644 (file)
@@ -74,11 +74,30 @@ class ParamContext
 
   public:
 
-    // Second arg, if set to true, says don't put on paramContextList
-    // (i.e. don't automatically parse params).  Used by derived
-    // SimObjectBuilder class, where parsing is done in
-    // SimObject::create()
-    ParamContext(const std::string &_iniSection, bool noAutoParse = false);
+    /// Initialization phases for ParamContext objects.
+    enum InitPhase {
+        NoAutoInit = -1,       ///< Don't initialize at all... params
+                                /// will be parsed later (used by
+                                /// SimObjectBuilder, which parses
+                                /// params in SimObject::create().
+        OutputInitPhase = 0,   ///< Output stream initialization
+        TraceInitPhase = 1,    ///< Trace context initialization:
+                                /// depends on output streams, but
+                                /// needs to come before others so we
+                                /// can use tracing in other
+                                /// ParamContext init code
+        StatsInitPhase = 2,    ///< Stats output initialization
+        DefaultInitPhase = 3   ///< Everything else
+    };
+
+    /// Records the initialization phase for this ParamContext.
+    InitPhase initPhase;
+
+    /// Constructor.
+    /// @param _iniSection Name of .ini section corresponding to this context.
+    /// @param _initPhase Initialization phase  (see InitPhase).
+    ParamContext(const std::string &_iniSection,
+                 InitPhase _initPhase = DefaultInitPhase);
 
     virtual ~ParamContext() {}
 
index ffff52104185efcf93b495c469ff4b641babf259..824b985fa8642acc4c4bcacf56f210f13e7f1394 100644 (file)
@@ -56,7 +56,8 @@ ostream *configStream;
 class UniverseParamContext : public ParamContext
 {
   public:
-    UniverseParamContext(const string &is) : ParamContext(is) {}
+    UniverseParamContext(const string &is)
+        : ParamContext(is, OutputInitPhase) {}
     void checkParams();
 };