checkpointing: minor cleanup.

Move some static checkpoint stuff into the
Checkpoint object namespace.
This commit is contained in:
Steve Reinhardt 2010-07-05 21:39:38 -07:00
parent 820bb3044d
commit 345dfd1b41
2 changed files with 44 additions and 39 deletions

View file

@ -427,8 +427,7 @@ Serializable::unserialize(Checkpoint *cp, const string &section)
void
Serializable::serializeAll(const string &cpt_dir)
{
setCheckpointDir(cpt_dir);
string dir = Checkpoint::dir();
string dir = Checkpoint::setDir(cpt_dir);
if (mkdir(dir.c_str(), 0775) == -1 && errno != EEXIST)
fatal("couldn't mkdir %s\n", dir);
@ -446,14 +445,10 @@ Serializable::serializeAll(const string &cpt_dir)
void
Serializable::unserializeAll(const string &cpt_dir)
{
setCheckpointDir(cpt_dir);
string dir = Checkpoint::dir();
string cpt_file = dir + Checkpoint::baseFilename;
string section = "";
string dir = Checkpoint::setDir(cpt_dir);
DPRINTFR(Config, "Loading checkpoint dir '%s'\n",
dir);
Checkpoint *cp = new Checkpoint(dir, section);
DPRINTFR(Config, "Loading checkpoint dir '%s'\n", dir);
Checkpoint *cp = new Checkpoint(dir);
unserializeGlobals(cp);
SimObject::unserializeAll(cp);
}
@ -464,27 +459,6 @@ Serializable::unserializeGlobals(Checkpoint *cp)
globals.unserialize(cp);
}
const char *Checkpoint::baseFilename = "m5.cpt";
static string checkpointDirBase;
void
setCheckpointDir(const string &name)
{
checkpointDirBase = name;
if (checkpointDirBase[checkpointDirBase.size() - 1] != '/')
checkpointDirBase += "/";
}
string
Checkpoint::dir()
{
// 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
debug_serialize(const string &cpt_dir)
{
@ -554,8 +528,31 @@ Serializable::create(Checkpoint *cp, const string &section)
}
Checkpoint::Checkpoint(const string &cpt_dir, const string &path)
: db(new IniFile), basePath(path), cptDir(cpt_dir)
const char *Checkpoint::baseFilename = "m5.cpt";
string Checkpoint::currentDirectory;
string
Checkpoint::setDir(const string &name)
{
// use csprintf to insert curTick into directory name if it
// appears to have a format placeholder in it.
currentDirectory = (name.find("%") != string::npos) ?
csprintf(name, curTick) : name;
if (currentDirectory[currentDirectory.size() - 1] != '/')
currentDirectory += "/";
return currentDirectory;
}
string
Checkpoint::dir()
{
return currentDirectory;
}
Checkpoint::Checkpoint(const string &cpt_dir)
: db(new IniFile), cptDir(cpt_dir)
{
string filename = cpt_dir + "/" + Checkpoint::baseFilename;
if (!db->load(filename)) {

View file

@ -219,19 +219,14 @@ class SerializableClass
SerializableClass the##OBJ_CLASS##Class(CLASS_NAME, \
OBJ_CLASS::createForUnserialize);
void
setCheckpointDir(const std::string &name);
class Checkpoint
{
private:
IniFile *db;
const std::string basePath;
std::map<std::string, Serializable*> objMap;
public:
Checkpoint(const std::string &cpt_dir, const std::string &path);
Checkpoint(const std::string &cpt_dir);
const std::string cptDir;
@ -245,7 +240,20 @@ class Checkpoint
// The following static functions have to do with checkpoint
// creation rather than restoration. This class makes a handy
// namespace for them though.
// namespace for them though. Currently no Checkpoint object is
// created on serialization (only unserialization) so we track the
// directory name as a global. It would be nice to change this
// someday
private:
// current directory we're serializing into.
static std::string currentDirectory;
public:
// Set the current directory. This function takes care of
// inserting curTick if there's a '%d' in the argument, and
// appends a '/' if necessary. The final name is returned.
static std::string setDir(const std::string &base_name);
// Export current checkpoint directory name so other objects can
// derive filenames from it (e.g., memory). The return value is