Modify handling of serialize:dir parameter to make it more useful.
authorSteve Reinhardt <stever@eecs.umich.edu>
Sun, 11 Jan 2004 23:24:18 +0000 (15:24 -0800)
committerSteve Reinhardt <stever@eecs.umich.edu>
Sun, 11 Jan 2004 23:24:18 +0000 (15:24 -0800)
Move global checkpoint-related functions and vars into Checkpoint class (as statics).

arch/alpha/pseudo_inst.cc:
dev/disk_image.cc:
    Move global checkpoint-related functions and vars
    into Checkpoint class (as statics).
sim/serialize.cc:
    Move global checkpoint-related functions and vars
    into Checkpoint class (as statics).

    Checkpoint constructor now takes checkpoint directory name instead
    of file name.

    Make serialize:dir parameter actually set checkpoint directory name
    instead of directory in which checkpoint directory is created.  If
    the value contains a '%', the curTick value is sprintf'd into the
    format to create the directory name.  The default is backwards compatible
    with the old fixed name ("m5.%012d").
sim/serialize.hh:
    Move global checkpoint-related functions and vars
    into Checkpoint class (as statics).

    Checkpoint constructor now takes checkpoint directory name instead
    of file name.

--HG--
extra : convert_revision : d0aa87b62911f405a4f5811271b9e6351fdd9fe4

arch/alpha/pseudo_inst.cc
dev/disk_image.cc
sim/serialize.cc
sim/serialize.hh

index c5d82bd21573d5f5fdf2dc00a2509a20e6b901a8..7f8c6b17ccf4542223ac70aa3f3cd6aa7182a655 100644 (file)
@@ -127,7 +127,7 @@ namespace AlphaPseudo
         Tick when = curTick + NS2Ticks(delay);
         Tick repeat = NS2Ticks(period);
 
-        SetupCheckpoint(when, repeat);
+        Checkpoint::setup(when, repeat);
     }
 
     class Context : public ParamContext
index 02c8b50b641474c27b99c69edef6c63628ea7db1..142fb60a5c624909a4281a67e6ea70e35498b608 100644 (file)
@@ -405,7 +405,7 @@ CowDiskImage::write(const uint8_t *data, off_t offset)
 void
 CowDiskImage::serialize(ostream &os)
 {
-    string cowFilename = CheckpointDir() + name() + ".cow";
+    string cowFilename = Checkpoint::dir() + name() + ".cow";
     SERIALIZE_SCALAR(cowFilename);
     save(cowFilename);
 }
index 95aacc361c8b328db8f4feee94feecb23327857b..33956c6e7e7cd8feac3635fa660e7a6701d8c3f6 100644 (file)
@@ -222,11 +222,11 @@ Globals::unserialize(Checkpoint *cp)
 void
 Serializable::serializeAll()
 {
-    string dir = CheckpointDir();
+    string dir = Checkpoint::dir();
     if (mkdir(dir.c_str(), 0775) == -1 && errno != EEXIST)
-            warn("could mkdir %s\n", dir);
+            fatal("couldn't mkdir %s\n", dir);
 
-    string cpt_file = dir + "m5.cpt";
+    string cpt_file = dir + Checkpoint::baseFilename;
     ofstream outstream(cpt_file.c_str());
     time_t t = time(NULL);
     outstream << "// checkpoint generated: " << ctime(&t);
@@ -273,19 +273,21 @@ SerializeEvent::process()
         schedule(curTick + repeat);
 }
 
-string __CheckpointDirBase;
+const char *Checkpoint::baseFilename = "m5.cpt";
+
+static string checkpointDirBase;
 
 string
-CheckpointDir()
+Checkpoint::dir()
 {
-    if (__CheckpointDirBase.empty())
-        return __CheckpointDirBase;
-
-    return csprintf("%s/m5.%012d/", __CheckpointDirBase, curTick);
+    // use csprintf to insert curTick into directory name if it
+    // appears to have a format placeholder in it.
+    return (checkpointDirBase.find("%") != string::npos) ?
+        csprintf(checkpointDirBase, curTick) : checkpointDirBase;
 }
 
 void
-SetupCheckpoint(Tick when, Tick period)
+Checkpoint::setup(Tick when, Tick period)
 {
     new SerializeEvent(when, period);
 }
@@ -304,8 +306,9 @@ class SerializeParamContext : public ParamContext
 SerializeParamContext serialParams("serialize");
 
 Param<string> serialize_dir(&serialParams,
-                             "dir",
-                             "dir to stick checkpoint in", ".");
+                            "dir",
+                            "dir to stick checkpoint in "
+                            "(sprintf format with cycle #)", "m5.%012d");
 
 Param<Counter> serialize_cycle(&serialParams,
                                 "cycle",
@@ -330,9 +333,14 @@ SerializeParamContext::~SerializeParamContext()
 void
 SerializeParamContext::checkParams()
 {
-    __CheckpointDirBase = serialize_dir;
+    checkpointDirBase = serialize_dir;
+    // guarantee that directory ends with a '/'
+    if (checkpointDirBase[checkpointDirBase.size() - 1] != '/') {
+        checkpointDirBase += "/";
+    }
+
     if (serialize_cycle > 0)
-        SetupCheckpoint(serialize_cycle, serialize_period);
+        Checkpoint::setup(serialize_cycle, serialize_period);
 }
 
 void
@@ -415,10 +423,11 @@ Serializable::create(Checkpoint *cp, const std::string &section)
 }
 
 
-Checkpoint::Checkpoint(const std::string &filename, const std::string &path,
+Checkpoint::Checkpoint(const std::string &cpt_dir, const std::string &path,
                        const ConfigNode *_configNode)
     : db(new IniFile), basePath(path), configNode(_configNode)
 {
+    string filename = cpt_dir + "/" + Checkpoint::baseFilename;
     if (!db->load(filename)) {
         fatal("Can't load checkpoint file '%s'\n", filename);
     }
index 60e06f94befd949b190fed3f1fc67a311fa8e976..32802409d5c58c2444448f9118577cc77f3cdbe5 100644 (file)
@@ -207,7 +207,7 @@ class Checkpoint
     std::map<std::string, Serializable*> objMap;
 
   public:
-    Checkpoint(const std::string &filename, const std::string &path,
+    Checkpoint(const std::string &cpt_dir, const std::string &path,
                const ConfigNode *_configNode);
 
     bool find(const std::string &section, const std::string &entry,
@@ -217,14 +217,22 @@ class Checkpoint
                  Serializable *&value);
 
     bool sectionExists(const std::string &section);
-};
 
+    // The following static functions have to do with checkpoint
+    // creation rather than restoration.  This class makes a handy
+    // namespace for them though.
 
-//
-// Export checkpoint filename param so other objects can derive
-// filenames from it (e.g., memory).
-//
-std::string CheckpointDir();
-void SetupCheckpoint(Tick when, Tick period = 0);
+    // Export current checkpoint directory name so other objects can
+    // derive filenames from it (e.g., memory).  The return value is
+    // guaranteed to end in '/' so filenames can be directly appended.
+    // This function is only valid while a checkpoint is being created.
+    static std::string dir();
+
+    // Filename for base checkpoint file within directory.
+    static const char *baseFilename;
+
+    // Set up a checkpoint creation event or series of events.
+    static void setup(Tick when, Tick period = 0);
+};
 
 #endif // __SERIALIZE_HH__