checkpointing: minor cleanup.
Move some static checkpoint stuff into the Checkpoint object namespace.
This commit is contained in:
parent
820bb3044d
commit
345dfd1b41
2 changed files with 44 additions and 39 deletions
|
@ -427,8 +427,7 @@ Serializable::unserialize(Checkpoint *cp, const string §ion)
|
||||||
void
|
void
|
||||||
Serializable::serializeAll(const string &cpt_dir)
|
Serializable::serializeAll(const string &cpt_dir)
|
||||||
{
|
{
|
||||||
setCheckpointDir(cpt_dir);
|
string dir = Checkpoint::setDir(cpt_dir);
|
||||||
string dir = Checkpoint::dir();
|
|
||||||
if (mkdir(dir.c_str(), 0775) == -1 && errno != EEXIST)
|
if (mkdir(dir.c_str(), 0775) == -1 && errno != EEXIST)
|
||||||
fatal("couldn't mkdir %s\n", dir);
|
fatal("couldn't mkdir %s\n", dir);
|
||||||
|
|
||||||
|
@ -446,14 +445,10 @@ Serializable::serializeAll(const string &cpt_dir)
|
||||||
void
|
void
|
||||||
Serializable::unserializeAll(const string &cpt_dir)
|
Serializable::unserializeAll(const string &cpt_dir)
|
||||||
{
|
{
|
||||||
setCheckpointDir(cpt_dir);
|
string dir = Checkpoint::setDir(cpt_dir);
|
||||||
string dir = Checkpoint::dir();
|
|
||||||
string cpt_file = dir + Checkpoint::baseFilename;
|
|
||||||
string section = "";
|
|
||||||
|
|
||||||
DPRINTFR(Config, "Loading checkpoint dir '%s'\n",
|
DPRINTFR(Config, "Loading checkpoint dir '%s'\n", dir);
|
||||||
dir);
|
Checkpoint *cp = new Checkpoint(dir);
|
||||||
Checkpoint *cp = new Checkpoint(dir, section);
|
|
||||||
unserializeGlobals(cp);
|
unserializeGlobals(cp);
|
||||||
SimObject::unserializeAll(cp);
|
SimObject::unserializeAll(cp);
|
||||||
}
|
}
|
||||||
|
@ -464,27 +459,6 @@ Serializable::unserializeGlobals(Checkpoint *cp)
|
||||||
globals.unserialize(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
|
void
|
||||||
debug_serialize(const string &cpt_dir)
|
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)
|
const char *Checkpoint::baseFilename = "m5.cpt";
|
||||||
: db(new IniFile), basePath(path), cptDir(cpt_dir)
|
|
||||||
|
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;
|
string filename = cpt_dir + "/" + Checkpoint::baseFilename;
|
||||||
if (!db->load(filename)) {
|
if (!db->load(filename)) {
|
||||||
|
|
|
@ -219,19 +219,14 @@ class SerializableClass
|
||||||
SerializableClass the##OBJ_CLASS##Class(CLASS_NAME, \
|
SerializableClass the##OBJ_CLASS##Class(CLASS_NAME, \
|
||||||
OBJ_CLASS::createForUnserialize);
|
OBJ_CLASS::createForUnserialize);
|
||||||
|
|
||||||
void
|
|
||||||
setCheckpointDir(const std::string &name);
|
|
||||||
|
|
||||||
class Checkpoint
|
class Checkpoint
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
|
||||||
IniFile *db;
|
IniFile *db;
|
||||||
const std::string basePath;
|
|
||||||
std::map<std::string, Serializable*> objMap;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Checkpoint(const std::string &cpt_dir, const std::string &path);
|
Checkpoint(const std::string &cpt_dir);
|
||||||
|
|
||||||
const std::string cptDir;
|
const std::string cptDir;
|
||||||
|
|
||||||
|
@ -245,7 +240,20 @@ class Checkpoint
|
||||||
|
|
||||||
// The following static functions have to do with checkpoint
|
// The following static functions have to do with checkpoint
|
||||||
// creation rather than restoration. This class makes a handy
|
// 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
|
// Export current checkpoint directory name so other objects can
|
||||||
// derive filenames from it (e.g., memory). The return value is
|
// derive filenames from it (e.g., memory). The return value is
|
||||||
|
|
Loading…
Reference in a new issue