checkpointing: minor cleanup.
Move some static checkpoint stuff into the Checkpoint object namespace.
This commit is contained in:
parent
820bb3044d
commit
345dfd1b41
|
@ -427,8 +427,7 @@ Serializable::unserialize(Checkpoint *cp, const string §ion)
|
|||
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 §ion)
|
|||
}
|
||||
|
||||
|
||||
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)) {
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue