serialize.hh revision 6820
14309Sgblack@eecs.umich.edu/* 24309Sgblack@eecs.umich.edu * Copyright (c) 2002-2005 The Regents of The University of Michigan 35426Sgblack@eecs.umich.edu * All rights reserved. 44309Sgblack@eecs.umich.edu * 54309Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without 64309Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are 74309Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright 84309Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer; 94309Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright 104309Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the 114309Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution; 124309Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its 134309Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from 144309Sgblack@eecs.umich.edu * this software without specific prior written permission. 154309Sgblack@eecs.umich.edu * 164309Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 174309Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 184309Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 194309Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 204309Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 214309Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 224309Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 234309Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 244309Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 254309Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 264309Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 274309Sgblack@eecs.umich.edu * 284309Sgblack@eecs.umich.edu * Authors: Nathan Binkert 294309Sgblack@eecs.umich.edu * Erik Hallnor 304309Sgblack@eecs.umich.edu * Steve Reinhardt 314309Sgblack@eecs.umich.edu */ 324309Sgblack@eecs.umich.edu 334309Sgblack@eecs.umich.edu/* @file 344309Sgblack@eecs.umich.edu * Serialization Interface Declarations 354309Sgblack@eecs.umich.edu */ 364309Sgblack@eecs.umich.edu 374309Sgblack@eecs.umich.edu#ifndef __SERIALIZE_HH__ 384309Sgblack@eecs.umich.edu#define __SERIALIZE_HH__ 394309Sgblack@eecs.umich.edu 404309Sgblack@eecs.umich.edu 414309Sgblack@eecs.umich.edu#include <list> 424309Sgblack@eecs.umich.edu#include <vector> 434309Sgblack@eecs.umich.edu#include <iostream> 444309Sgblack@eecs.umich.edu#include <map> 454309Sgblack@eecs.umich.edu 464309Sgblack@eecs.umich.edu#include "base/types.hh" 474309Sgblack@eecs.umich.edu 484309Sgblack@eecs.umich.educlass IniFile; 494309Sgblack@eecs.umich.educlass Serializable; 504309Sgblack@eecs.umich.educlass Checkpoint; 514309Sgblack@eecs.umich.educlass SimObject; 524309Sgblack@eecs.umich.edu 534309Sgblack@eecs.umich.edutemplate <class T> 544309Sgblack@eecs.umich.eduvoid paramOut(std::ostream &os, const std::string &name, const T ¶m); 554309Sgblack@eecs.umich.edu 564309Sgblack@eecs.umich.edutemplate <class T> 574309Sgblack@eecs.umich.eduvoid paramIn(Checkpoint *cp, const std::string §ion, 584533Sgblack@eecs.umich.edu const std::string &name, T ¶m); 594679Sgblack@eecs.umich.edu 604679Sgblack@eecs.umich.edutemplate <class T> 614679Sgblack@eecs.umich.edubool optParamIn(Checkpoint *cp, const std::string §ion, 624533Sgblack@eecs.umich.edu const std::string &name, T ¶m); 634533Sgblack@eecs.umich.edu 644537Sgblack@eecs.umich.edutemplate <class T> 654533Sgblack@eecs.umich.eduvoid arrayParamOut(std::ostream &os, const std::string &name, 664528Sgblack@eecs.umich.edu const T *param, unsigned size); 675666Sgblack@eecs.umich.edu 685666Sgblack@eecs.umich.edutemplate <class T> 695666Sgblack@eecs.umich.eduvoid arrayParamOut(std::ostream &os, const std::string &name, 704528Sgblack@eecs.umich.edu const std::vector<T> ¶m); 714528Sgblack@eecs.umich.edu 724528Sgblack@eecs.umich.edutemplate <class T> 734528Sgblack@eecs.umich.eduvoid arrayParamIn(Checkpoint *cp, const std::string §ion, 744605Sgblack@eecs.umich.edu const std::string &name, T *param, unsigned size); 755666Sgblack@eecs.umich.edu 765666Sgblack@eecs.umich.edutemplate <class T> 774528Sgblack@eecs.umich.eduvoid arrayParamIn(Checkpoint *cp, const std::string §ion, 784615Sgblack@eecs.umich.edu const std::string &name, std::vector<T> ¶m); 794615Sgblack@eecs.umich.edu 804615Sgblack@eecs.umich.eduvoid 815045Sgblack@eecs.umich.eduobjParamIn(Checkpoint *cp, const std::string §ion, 825045Sgblack@eecs.umich.edu const std::string &name, SimObject * ¶m); 834615Sgblack@eecs.umich.edu 844615Sgblack@eecs.umich.edu 854615Sgblack@eecs.umich.edu// 865291Sgblack@eecs.umich.edu// These macros are streamlined to use in serialize/unserialize 875428Sgblack@eecs.umich.edu// functions. It's assumed that serialize() has a parameter 'os' for 885428Sgblack@eecs.umich.edu// the ostream, and unserialize() has parameters 'cp' and 'section'. 895428Sgblack@eecs.umich.edu#define SERIALIZE_SCALAR(scalar) paramOut(os, #scalar, scalar) 905428Sgblack@eecs.umich.edu 915428Sgblack@eecs.umich.edu#define UNSERIALIZE_SCALAR(scalar) paramIn(cp, section, #scalar, scalar) 925294Sgblack@eecs.umich.edu#define UNSERIALIZE_OPT_SCALAR(scalar) optParamIn(cp, section, #scalar, scalar) 935291Sgblack@eecs.umich.edu 945291Sgblack@eecs.umich.edu// ENUMs are like SCALARs, but we cast them to ints on the way out 955294Sgblack@eecs.umich.edu#define SERIALIZE_ENUM(scalar) paramOut(os, #scalar, (int)scalar) 965294Sgblack@eecs.umich.edu 975294Sgblack@eecs.umich.edu#define UNSERIALIZE_ENUM(scalar) \ 984615Sgblack@eecs.umich.edu do { \ 994615Sgblack@eecs.umich.edu int tmp; \ 1004615Sgblack@eecs.umich.edu paramIn(cp, section, #scalar, tmp); \ 1015029Sgblack@eecs.umich.edu scalar = (typeof(scalar))tmp; \ 1025029Sgblack@eecs.umich.edu } while (0) 1034615Sgblack@eecs.umich.edu 1045029Sgblack@eecs.umich.edu#define SERIALIZE_ARRAY(member, size) \ 1055029Sgblack@eecs.umich.edu arrayParamOut(os, #member, member, size) 1065161Sgblack@eecs.umich.edu 1075161Sgblack@eecs.umich.edu#define UNSERIALIZE_ARRAY(member, size) \ 1084863Sgblack@eecs.umich.edu arrayParamIn(cp, section, #member, member, size) 1094615Sgblack@eecs.umich.edu 1104615Sgblack@eecs.umich.edu#define SERIALIZE_OBJPTR(objptr) paramOut(os, #objptr, (objptr)->name()) 1114615Sgblack@eecs.umich.edu 1124615Sgblack@eecs.umich.edu#define UNSERIALIZE_OBJPTR(objptr) \ 1134953Sgblack@eecs.umich.edu do { \ 1144615Sgblack@eecs.umich.edu SimObject *sptr; \ 1154615Sgblack@eecs.umich.edu objParamIn(cp, section, #objptr, sptr); \ 1164863Sgblack@eecs.umich.edu objptr = dynamic_cast<typeof(objptr)>(sptr); \ 1174863Sgblack@eecs.umich.edu } while (0) 1185326Sgblack@eecs.umich.edu 1195326Sgblack@eecs.umich.edu/* 1205326Sgblack@eecs.umich.edu * Basic support for object serialization. 1215326Sgblack@eecs.umich.edu */ 1225326Sgblack@eecs.umich.educlass Serializable 1235326Sgblack@eecs.umich.edu{ 1245326Sgblack@eecs.umich.edu protected: 1255326Sgblack@eecs.umich.edu void nameOut(std::ostream &os); 1265326Sgblack@eecs.umich.edu void nameOut(std::ostream &os, const std::string &_name); 1274863Sgblack@eecs.umich.edu 1284863Sgblack@eecs.umich.edu public: 1294863Sgblack@eecs.umich.edu Serializable(); 1304863Sgblack@eecs.umich.edu virtual ~Serializable(); 1314863Sgblack@eecs.umich.edu 1324620Sgblack@eecs.umich.edu // manditory virtual function, so objects must provide names 1335149Sgblack@eecs.umich.edu virtual const std::string name() const = 0; 1345149Sgblack@eecs.umich.edu 1355294Sgblack@eecs.umich.edu virtual void serialize(std::ostream &os); 1365294Sgblack@eecs.umich.edu virtual void unserialize(Checkpoint *cp, const std::string §ion); 1375294Sgblack@eecs.umich.edu 1385294Sgblack@eecs.umich.edu static Serializable *create(Checkpoint *cp, const std::string §ion); 1395149Sgblack@eecs.umich.edu 1404620Sgblack@eecs.umich.edu static int ckptCount; 1414620Sgblack@eecs.umich.edu static int ckptMaxCount; 1424615Sgblack@eecs.umich.edu static int ckptPrevCount; 1435241Sgblack@eecs.umich.edu static void serializeAll(const std::string &cpt_dir); 1445241Sgblack@eecs.umich.edu static void unserializeAll(const std::string &cpt_dir); 1455241Sgblack@eecs.umich.edu static void unserializeGlobals(Checkpoint *cp); 1465426Sgblack@eecs.umich.edu}; 1475426Sgblack@eecs.umich.edu 1484686Sgblack@eecs.umich.edu// 1494686Sgblack@eecs.umich.edu// A SerializableBuilder serves as an evaluation context for a set of 1504686Sgblack@eecs.umich.edu// parameters that describe a specific instance of a Serializable. This 1514953Sgblack@eecs.umich.edu// evaluation context corresponds to a section in the .ini file (as 1524686Sgblack@eecs.umich.edu// with the base ParamContext) plus an optional node in the 1534686Sgblack@eecs.umich.edu// configuration hierarchy (the configNode member) for resolving 1544686Sgblack@eecs.umich.edu// Serializable references. SerializableBuilder is an abstract superclass; 1554686Sgblack@eecs.umich.edu// derived classes specialize the class for particular subclasses of 1564953Sgblack@eecs.umich.edu// Serializable (e.g., BaseCache). 1574953Sgblack@eecs.umich.edu// 1584686Sgblack@eecs.umich.edu// For typical usage, see the definition of 1594686Sgblack@eecs.umich.edu// SerializableClass::createObject(). 1604686Sgblack@eecs.umich.edu// 1614686Sgblack@eecs.umich.educlass SerializableBuilder 1624615Sgblack@eecs.umich.edu{ 1634615Sgblack@eecs.umich.edu public: 1644615Sgblack@eecs.umich.edu 1654615Sgblack@eecs.umich.edu SerializableBuilder() {} 1664615Sgblack@eecs.umich.edu 1674615Sgblack@eecs.umich.edu virtual ~SerializableBuilder() {} 1684615Sgblack@eecs.umich.edu 1695291Sgblack@eecs.umich.edu // Create the actual Serializable corresponding to the parameter 1705291Sgblack@eecs.umich.edu // values in this context. This function is overridden in derived 1715291Sgblack@eecs.umich.edu // classes to call a specific constructor for a particular 1725291Sgblack@eecs.umich.edu // subclass of Serializable. 1735291Sgblack@eecs.umich.edu virtual Serializable *create() = 0; 1745291Sgblack@eecs.umich.edu}; 1755291Sgblack@eecs.umich.edu 1765161Sgblack@eecs.umich.edu// 1775161Sgblack@eecs.umich.edu// An instance of SerializableClass corresponds to a class derived from 1785161Sgblack@eecs.umich.edu// Serializable. The SerializableClass instance serves to bind the string 1795161Sgblack@eecs.umich.edu// name (found in the config file) to a function that creates an 1805161Sgblack@eecs.umich.edu// instance of the appropriate derived class. 1815008Sgblack@eecs.umich.edu// 1825008Sgblack@eecs.umich.edu// This would be much cleaner in Smalltalk or Objective-C, where types 1835008Sgblack@eecs.umich.edu// are first-class objects themselves. 1845008Sgblack@eecs.umich.edu// 1855008Sgblack@eecs.umich.educlass SerializableClass 1865667Sgblack@eecs.umich.edu{ 1875667Sgblack@eecs.umich.edu public: 1885667Sgblack@eecs.umich.edu 1895667Sgblack@eecs.umich.edu // Type CreateFunc is a pointer to a function that creates a new 1905667Sgblack@eecs.umich.edu // simulation object builder based on a .ini-file parameter 1915082Sgblack@eecs.umich.edu // section (specified by the first string argument), a unique name 1925121Sgblack@eecs.umich.edu // for the object (specified by the second string argument), and 1935082Sgblack@eecs.umich.edu // an optional config hierarchy node (specified by the third 1945082Sgblack@eecs.umich.edu // argument). A pointer to the new SerializableBuilder is returned. 1955082Sgblack@eecs.umich.edu typedef Serializable *(*CreateFunc)(Checkpoint *cp, 1964528Sgblack@eecs.umich.edu const std::string §ion); 1975666Sgblack@eecs.umich.edu 1985666Sgblack@eecs.umich.edu static std::map<std::string,CreateFunc> *classMap; 1995666Sgblack@eecs.umich.edu 2004528Sgblack@eecs.umich.edu // Constructor. For example: 201 // 202 // SerializableClass baseCacheSerializableClass("BaseCacheSerializable", 203 // newBaseCacheSerializableBuilder); 204 // 205 SerializableClass(const std::string &className, CreateFunc createFunc); 206 207 // create Serializable given name of class and pointer to 208 // configuration hierarchy node 209 static Serializable *createObject(Checkpoint *cp, 210 const std::string §ion); 211}; 212 213// 214// Macros to encapsulate the magic of declaring & defining 215// SerializableBuilder and SerializableClass objects 216// 217 218#define REGISTER_SERIALIZEABLE(CLASS_NAME, OBJ_CLASS) \ 219SerializableClass the##OBJ_CLASS##Class(CLASS_NAME, \ 220 OBJ_CLASS::createForUnserialize); 221 222void 223setCheckpointDir(const std::string &name); 224 225class Checkpoint 226{ 227 private: 228 229 IniFile *db; 230 const std::string basePath; 231 std::map<std::string, Serializable*> objMap; 232 233 public: 234 Checkpoint(const std::string &cpt_dir, const std::string &path); 235 236 const std::string cptDir; 237 238 bool find(const std::string §ion, const std::string &entry, 239 std::string &value); 240 241 bool findObj(const std::string §ion, const std::string &entry, 242 SimObject *&value); 243 244 bool sectionExists(const std::string §ion); 245 246 // The following static functions have to do with checkpoint 247 // creation rather than restoration. This class makes a handy 248 // namespace for them though. 249 250 // Export current checkpoint directory name so other objects can 251 // derive filenames from it (e.g., memory). The return value is 252 // guaranteed to end in '/' so filenames can be directly appended. 253 // This function is only valid while a checkpoint is being created. 254 static std::string dir(); 255 256 // Filename for base checkpoint file within directory. 257 static const char *baseFilename; 258}; 259 260#endif // __SERIALIZE_HH__ 261