serialize.hh revision 2760:4dbf498165ac
15647Sgblack@eecs.umich.edu/* 25647Sgblack@eecs.umich.edu * Copyright (c) 2002-2005 The Regents of The University of Michigan 35647Sgblack@eecs.umich.edu * All rights reserved. 45647Sgblack@eecs.umich.edu * 55647Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without 65647Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are 75647Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright 85647Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer; 95647Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright 105647Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the 115647Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution; 125647Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its 135647Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from 145647Sgblack@eecs.umich.edu * this software without specific prior written permission. 155647Sgblack@eecs.umich.edu * 165647Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 175647Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 185647Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 195647Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 205647Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 215647Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 225647Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 235647Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 245647Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 255647Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 265647Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 275647Sgblack@eecs.umich.edu * 285647Sgblack@eecs.umich.edu * Authors: Nathan Binkert 295647Sgblack@eecs.umich.edu * Erik Hallnor 305647Sgblack@eecs.umich.edu * Steve Reinhardt 315647Sgblack@eecs.umich.edu */ 325647Sgblack@eecs.umich.edu 335647Sgblack@eecs.umich.edu/* @file 345647Sgblack@eecs.umich.edu * Serialization Interface Declarations 355647Sgblack@eecs.umich.edu */ 365647Sgblack@eecs.umich.edu 375647Sgblack@eecs.umich.edu#ifndef __SERIALIZE_HH__ 385647Sgblack@eecs.umich.edu#define __SERIALIZE_HH__ 395647Sgblack@eecs.umich.edu 405647Sgblack@eecs.umich.edu 415647Sgblack@eecs.umich.edu#include <list> 425647Sgblack@eecs.umich.edu#include <iostream> 435647Sgblack@eecs.umich.edu#include <map> 445647Sgblack@eecs.umich.edu 455647Sgblack@eecs.umich.edu#include "sim/host.hh" 465647Sgblack@eecs.umich.edu 475647Sgblack@eecs.umich.educlass IniFile; 485647Sgblack@eecs.umich.educlass Serializable; 495647Sgblack@eecs.umich.educlass Checkpoint; 505647Sgblack@eecs.umich.edu 515647Sgblack@eecs.umich.edutemplate <class T> 525647Sgblack@eecs.umich.eduvoid paramOut(std::ostream &os, const std::string &name, const T ¶m); 535647Sgblack@eecs.umich.edu 545647Sgblack@eecs.umich.edutemplate <class T> 555647Sgblack@eecs.umich.eduvoid paramIn(Checkpoint *cp, const std::string §ion, 565647Sgblack@eecs.umich.edu const std::string &name, T ¶m); 575647Sgblack@eecs.umich.edu 585648Sgblack@eecs.umich.edutemplate <class T> 595647Sgblack@eecs.umich.eduvoid arrayParamOut(std::ostream &os, const std::string &name, 605654Sgblack@eecs.umich.edu const T *param, int size); 615647Sgblack@eecs.umich.edu 625654Sgblack@eecs.umich.edutemplate <class T> 635647Sgblack@eecs.umich.eduvoid arrayParamIn(Checkpoint *cp, const std::string §ion, 645648Sgblack@eecs.umich.edu const std::string &name, T *param, int size); 655648Sgblack@eecs.umich.edu 665647Sgblack@eecs.umich.eduvoid 675647Sgblack@eecs.umich.eduobjParamIn(Checkpoint *cp, const std::string §ion, 685647Sgblack@eecs.umich.edu const std::string &name, Serializable * ¶m); 695647Sgblack@eecs.umich.edu 705647Sgblack@eecs.umich.edu 715647Sgblack@eecs.umich.edu// 725647Sgblack@eecs.umich.edu// These macros are streamlined to use in serialize/unserialize 735647Sgblack@eecs.umich.edu// functions. It's assumed that serialize() has a parameter 'os' for 745647Sgblack@eecs.umich.edu// the ostream, and unserialize() has parameters 'cp' and 'section'. 755648Sgblack@eecs.umich.edu#define SERIALIZE_SCALAR(scalar) paramOut(os, #scalar, scalar) 765647Sgblack@eecs.umich.edu 775648Sgblack@eecs.umich.edu#define UNSERIALIZE_SCALAR(scalar) paramIn(cp, section, #scalar, scalar) 785648Sgblack@eecs.umich.edu 795648Sgblack@eecs.umich.edu// ENUMs are like SCALARs, but we cast them to ints on the way out 805648Sgblack@eecs.umich.edu#define SERIALIZE_ENUM(scalar) paramOut(os, #scalar, (int)scalar) 815648Sgblack@eecs.umich.edu 825648Sgblack@eecs.umich.edu#define UNSERIALIZE_ENUM(scalar) \ 835648Sgblack@eecs.umich.edu do { \ 845648Sgblack@eecs.umich.edu int tmp; \ 855648Sgblack@eecs.umich.edu paramIn(cp, section, #scalar, tmp); \ 865648Sgblack@eecs.umich.edu scalar = (typeof(scalar))tmp; \ 875648Sgblack@eecs.umich.edu } while (0) 885648Sgblack@eecs.umich.edu 895648Sgblack@eecs.umich.edu#define SERIALIZE_ARRAY(member, size) \ 905648Sgblack@eecs.umich.edu arrayParamOut(os, #member, member, size) 915648Sgblack@eecs.umich.edu 925648Sgblack@eecs.umich.edu#define UNSERIALIZE_ARRAY(member, size) \ 935648Sgblack@eecs.umich.edu arrayParamIn(cp, section, #member, member, size) 945648Sgblack@eecs.umich.edu 955648Sgblack@eecs.umich.edu#define SERIALIZE_OBJPTR(objptr) paramOut(os, #objptr, (objptr)->name()) 965648Sgblack@eecs.umich.edu 975648Sgblack@eecs.umich.edu#define UNSERIALIZE_OBJPTR(objptr) \ 985648Sgblack@eecs.umich.edu do { \ 995648Sgblack@eecs.umich.edu Serializable *sptr; \ 1005648Sgblack@eecs.umich.edu objParamIn(cp, section, #objptr, sptr); \ 1015648Sgblack@eecs.umich.edu objptr = dynamic_cast<typeof(objptr)>(sptr); \ 1025648Sgblack@eecs.umich.edu } while (0) 1035648Sgblack@eecs.umich.edu 1045648Sgblack@eecs.umich.edu/* 1055648Sgblack@eecs.umich.edu * Basic support for object serialization. 1065648Sgblack@eecs.umich.edu */ 1075648Sgblack@eecs.umich.educlass Serializable 1085648Sgblack@eecs.umich.edu{ 1095648Sgblack@eecs.umich.edu protected: 1105648Sgblack@eecs.umich.edu void nameOut(std::ostream &os); 1115648Sgblack@eecs.umich.edu void nameOut(std::ostream &os, const std::string &_name); 1125648Sgblack@eecs.umich.edu 1135648Sgblack@eecs.umich.edu public: 1145648Sgblack@eecs.umich.edu Serializable() {} 1155648Sgblack@eecs.umich.edu virtual ~Serializable() {} 1165648Sgblack@eecs.umich.edu 1175648Sgblack@eecs.umich.edu // manditory virtual function, so objects must provide names 1185648Sgblack@eecs.umich.edu virtual const std::string name() const = 0; 1195648Sgblack@eecs.umich.edu 1205648Sgblack@eecs.umich.edu virtual void serialize(std::ostream &os) {} 1215648Sgblack@eecs.umich.edu virtual void unserialize(Checkpoint *cp, const std::string §ion) {} 1225648Sgblack@eecs.umich.edu 1235648Sgblack@eecs.umich.edu static Serializable *create(Checkpoint *cp, 1245648Sgblack@eecs.umich.edu const std::string §ion); 1255648Sgblack@eecs.umich.edu 1265648Sgblack@eecs.umich.edu static int ckptCount; 1275648Sgblack@eecs.umich.edu static int ckptMaxCount; 1285648Sgblack@eecs.umich.edu static int ckptPrevCount; 1295648Sgblack@eecs.umich.edu static void serializeAll(); 1305648Sgblack@eecs.umich.edu static void unserializeGlobals(Checkpoint *cp); 1315648Sgblack@eecs.umich.edu}; 1325648Sgblack@eecs.umich.edu 1335648Sgblack@eecs.umich.edu// 1345648Sgblack@eecs.umich.edu// A SerializableBuilder serves as an evaluation context for a set of 1355648Sgblack@eecs.umich.edu// parameters that describe a specific instance of a Serializable. This 1365648Sgblack@eecs.umich.edu// evaluation context corresponds to a section in the .ini file (as 1375648Sgblack@eecs.umich.edu// with the base ParamContext) plus an optional node in the 1385648Sgblack@eecs.umich.edu// configuration hierarchy (the configNode member) for resolving 1395648Sgblack@eecs.umich.edu// Serializable references. SerializableBuilder is an abstract superclass; 1405648Sgblack@eecs.umich.edu// derived classes specialize the class for particular subclasses of 1415648Sgblack@eecs.umich.edu// Serializable (e.g., BaseCache). 1425648Sgblack@eecs.umich.edu// 1435648Sgblack@eecs.umich.edu// For typical usage, see the definition of 1445648Sgblack@eecs.umich.edu// SerializableClass::createObject(). 1455648Sgblack@eecs.umich.edu// 1465648Sgblack@eecs.umich.educlass SerializableBuilder 1475648Sgblack@eecs.umich.edu{ 1485648Sgblack@eecs.umich.edu public: 1495648Sgblack@eecs.umich.edu 1505648Sgblack@eecs.umich.edu SerializableBuilder() {} 1515648Sgblack@eecs.umich.edu 1525648Sgblack@eecs.umich.edu virtual ~SerializableBuilder() {} 1535648Sgblack@eecs.umich.edu 1545648Sgblack@eecs.umich.edu // Create the actual Serializable corresponding to the parameter 1555648Sgblack@eecs.umich.edu // values in this context. This function is overridden in derived 1565648Sgblack@eecs.umich.edu // classes to call a specific constructor for a particular 1575648Sgblack@eecs.umich.edu // subclass of Serializable. 1585648Sgblack@eecs.umich.edu virtual Serializable *create() = 0; 1595648Sgblack@eecs.umich.edu}; 1605648Sgblack@eecs.umich.edu 1615648Sgblack@eecs.umich.edu// 1625648Sgblack@eecs.umich.edu// An instance of SerializableClass corresponds to a class derived from 1635648Sgblack@eecs.umich.edu// Serializable. The SerializableClass instance serves to bind the string 1645648Sgblack@eecs.umich.edu// name (found in the config file) to a function that creates an 1655648Sgblack@eecs.umich.edu// instance of the appropriate derived class. 1665648Sgblack@eecs.umich.edu// 1675648Sgblack@eecs.umich.edu// This would be much cleaner in Smalltalk or Objective-C, where types 1685648Sgblack@eecs.umich.edu// are first-class objects themselves. 1695648Sgblack@eecs.umich.edu// 1705648Sgblack@eecs.umich.educlass SerializableClass 1715648Sgblack@eecs.umich.edu{ 1725648Sgblack@eecs.umich.edu public: 1735648Sgblack@eecs.umich.edu 1745648Sgblack@eecs.umich.edu // Type CreateFunc is a pointer to a function that creates a new 1755648Sgblack@eecs.umich.edu // simulation object builder based on a .ini-file parameter 1765648Sgblack@eecs.umich.edu // section (specified by the first string argument), a unique name 1775648Sgblack@eecs.umich.edu // for the object (specified by the second string argument), and 1785648Sgblack@eecs.umich.edu // an optional config hierarchy node (specified by the third 1795648Sgblack@eecs.umich.edu // argument). A pointer to the new SerializableBuilder is returned. 1805648Sgblack@eecs.umich.edu typedef Serializable *(*CreateFunc)(Checkpoint *cp, 1815648Sgblack@eecs.umich.edu const std::string §ion); 1825648Sgblack@eecs.umich.edu 1835648Sgblack@eecs.umich.edu static std::map<std::string,CreateFunc> *classMap; 1845648Sgblack@eecs.umich.edu 1855648Sgblack@eecs.umich.edu // Constructor. For example: 1865648Sgblack@eecs.umich.edu // 1875648Sgblack@eecs.umich.edu // SerializableClass baseCacheSerializableClass("BaseCacheSerializable", 1885648Sgblack@eecs.umich.edu // newBaseCacheSerializableBuilder); 1895648Sgblack@eecs.umich.edu // 1905648Sgblack@eecs.umich.edu SerializableClass(const std::string &className, CreateFunc createFunc); 1915648Sgblack@eecs.umich.edu 1925648Sgblack@eecs.umich.edu // create Serializable given name of class and pointer to 1935648Sgblack@eecs.umich.edu // configuration hierarchy node 1945648Sgblack@eecs.umich.edu static Serializable *createObject(Checkpoint *cp, 1955648Sgblack@eecs.umich.edu const std::string §ion); 1965648Sgblack@eecs.umich.edu}; 1975648Sgblack@eecs.umich.edu 1985648Sgblack@eecs.umich.edu// 1995648Sgblack@eecs.umich.edu// Macros to encapsulate the magic of declaring & defining 2005648Sgblack@eecs.umich.edu// SerializableBuilder and SerializableClass objects 2015648Sgblack@eecs.umich.edu// 2025648Sgblack@eecs.umich.edu 2035648Sgblack@eecs.umich.edu#define REGISTER_SERIALIZEABLE(CLASS_NAME, OBJ_CLASS) \ 2045648Sgblack@eecs.umich.eduSerializableClass the##OBJ_CLASS##Class(CLASS_NAME, \ 2055648Sgblack@eecs.umich.edu OBJ_CLASS::createForUnserialize); 2065648Sgblack@eecs.umich.edu 2075648Sgblack@eecs.umich.educlass Checkpoint 2085648Sgblack@eecs.umich.edu{ 2095648Sgblack@eecs.umich.edu private: 2105648Sgblack@eecs.umich.edu 2115648Sgblack@eecs.umich.edu IniFile *db; 2125648Sgblack@eecs.umich.edu const std::string basePath; 2135648Sgblack@eecs.umich.edu std::map<std::string, Serializable*> objMap; 2145648Sgblack@eecs.umich.edu 2155648Sgblack@eecs.umich.edu public: 2165648Sgblack@eecs.umich.edu Checkpoint(const std::string &cpt_dir, const std::string &path); 2175648Sgblack@eecs.umich.edu 2185648Sgblack@eecs.umich.edu const std::string cptDir; 2195648Sgblack@eecs.umich.edu 2205649Sgblack@eecs.umich.edu bool find(const std::string §ion, const std::string &entry, 2215649Sgblack@eecs.umich.edu std::string &value); 2225649Sgblack@eecs.umich.edu 2235648Sgblack@eecs.umich.edu bool findObj(const std::string §ion, const std::string &entry, 2245648Sgblack@eecs.umich.edu Serializable *&value); 2255648Sgblack@eecs.umich.edu 2265648Sgblack@eecs.umich.edu bool sectionExists(const std::string §ion); 2275648Sgblack@eecs.umich.edu 2285648Sgblack@eecs.umich.edu // The following static functions have to do with checkpoint 2295648Sgblack@eecs.umich.edu // creation rather than restoration. This class makes a handy 2305648Sgblack@eecs.umich.edu // namespace for them though. 2315648Sgblack@eecs.umich.edu 2325648Sgblack@eecs.umich.edu // Export current checkpoint directory name so other objects can 2335648Sgblack@eecs.umich.edu // derive filenames from it (e.g., memory). The return value is 2345648Sgblack@eecs.umich.edu // guaranteed to end in '/' so filenames can be directly appended. 2355648Sgblack@eecs.umich.edu // This function is only valid while a checkpoint is being created. 2365648Sgblack@eecs.umich.edu static std::string dir(); 2375649Sgblack@eecs.umich.edu 2385649Sgblack@eecs.umich.edu // Filename for base checkpoint file within directory. 2395649Sgblack@eecs.umich.edu static const char *baseFilename; 2405648Sgblack@eecs.umich.edu 2415648Sgblack@eecs.umich.edu // Set up a checkpoint creation event or series of events. 2425647Sgblack@eecs.umich.edu static void setup(Tick when, Tick period = 0); 2435691Sgblack@eecs.umich.edu}; 2445691Sgblack@eecs.umich.edu 2455691Sgblack@eecs.umich.edu#endif // __SERIALIZE_HH__ 2465691Sgblack@eecs.umich.edu