* Steve Reinhardt
*/
+#include <sys/stat.h>
#include <sys/time.h>
#include <sys/types.h>
-#include <sys/stat.h>
-#include <errno.h>
+#include <cerrno>
#include <fstream>
#include <list>
#include <string>
}
+template <>
+void
+showParam(ostream &os, const signed char &value)
+{
+ os << (int)value;
+}
+
+
template <>
void
showParam(ostream &os, const unsigned char &value)
os << "\n";
}
+template <class T>
+void
+arrayParamOut(ostream &os, const string &name, const list<T> ¶m)
+{
+ typename list<T>::const_iterator it = param.begin();
+
+ os << name << "=";
+ if (param.size() > 0)
+ showParam(os, *it);
+ it++;
+ while (it != param.end()) {
+ os << " ";
+ showParam(os, *it);
+ it++;
+ }
+ os << "\n";
+}
template <class T>
void
// for which operator[] returns a special reference class
// that's not the same as 'bool&', (since it's a packed
// vector)
- T scalar_value;
+ T scalar_value = 0;
if (!parseParam(tokens[i], scalar_value)) {
string err("could not parse \"");
// for which operator[] returns a special reference class
// that's not the same as 'bool&', (since it's a packed
// vector)
- T scalar_value;
+ T scalar_value = 0;
if (!parseParam(tokens[i], scalar_value)) {
string err("could not parse \"");
}
}
+template <class T>
+void
+arrayParamIn(Checkpoint *cp, const string §ion,
+ const string &name, list<T> ¶m)
+{
+ string str;
+ if (!cp->find(section, name, str)) {
+ fatal("Can't unserialize '%s:%s'\n", section, name);
+ }
+ param.clear();
+
+ vector<string> tokens;
+ tokenize(tokens, str, ' ');
+
+ for (vector<string>::size_type i = 0; i < tokens.size(); i++) {
+ T scalar_value = 0;
+ if (!parseParam(tokens[i], scalar_value)) {
+ string err("could not parse \"");
+
+ err += str;
+ err += "\"";
+
+ fatal(err);
+ }
+
+ // assign parsed value to vector
+ param.push_back(scalar_value);
+ }
+}
+
+
void
objParamIn(Checkpoint *cp, const string §ion,
const string &name, SimObject * ¶m)
const vector<type> ¶m); \
template void \
arrayParamIn(Checkpoint *cp, const string §ion, \
- const string &name, vector<type> ¶m);
+ const string &name, vector<type> ¶m); \
+template void \
+arrayParamOut(ostream &os, const string &name, \
+ const list<type> ¶m); \
+template void \
+arrayParamIn(Checkpoint *cp, const string §ion, \
+ const string &name, list<type> ¶m);
+INSTANTIATE_PARAM_TEMPLATES(char)
INSTANTIATE_PARAM_TEMPLATES(signed char)
INSTANTIATE_PARAM_TEMPLATES(unsigned char)
INSTANTIATE_PARAM_TEMPLATES(signed short)
Globals::serialize(ostream &os)
{
nameOut(os);
- SERIALIZE_SCALAR(curTick);
+ paramOut(os, "curTick", curTick());
nameOut(os, "MainEventQueue");
mainEventQueue.serialize(os);
Globals::unserialize(Checkpoint *cp)
{
const string §ion = name();
- UNSERIALIZE_SCALAR(curTick);
+ Tick tick;
+ paramIn(cp, section, "curTick", tick);
+ curTick(tick);
mainEventQueue.unserialize(cp, "MainEventQueue");
}
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);
SimObject::serializeAll(outstream);
}
-void
-Serializable::unserializeAll(const string &cpt_dir)
-{
- setCheckpointDir(cpt_dir);
- string dir = Checkpoint::dir();
- string cpt_file = dir + Checkpoint::baseFilename;
- string section = "";
-
- DPRINTFR(Config, "Loading checkpoint dir '%s'\n",
- dir);
- Checkpoint *cp = new Checkpoint(dir, section);
- unserializeGlobals(cp);
- SimObject::unserializeAll(cp);
-}
-
void
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)
{
}
-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(setDir(cpt_dir))
{
- string filename = cpt_dir + "/" + Checkpoint::baseFilename;
+ string filename = cptDir + "/" + Checkpoint::baseFilename;
if (!db->load(filename)) {
fatal("Can't load checkpoint file '%s'\n", filename);
}