00001 // 00002 // Copyright (c) 2005-2008 Kenichi Watanabe. 00003 // Copyright (c) 2005-2008 Yasuhiro Watari. 00004 // Copyright (c) 2005-2008 Hironori Ichibayashi. 00005 // Copyright (c) 2008-2009 Kazuo Horio. 00006 // Copyright (c) 2009-2013 Naruki Kurata. 00007 // Copyright (c) 2005-2013 Ryota Shioya. 00008 // Copyright (c) 2005-2013 Masahiro Goshima. 00009 // 00010 // This software is provided 'as-is', without any express or implied 00011 // warranty. In no event will the authors be held liable for any damages 00012 // arising from the use of this software. 00013 // 00014 // Permission is granted to anyone to use this software for any purpose, 00015 // including commercial applications, and to alter it and redistribute it 00016 // freely, subject to the following restrictions: 00017 // 00018 // 1. The origin of this software must not be misrepresented; you must not 00019 // claim that you wrote the original software. If you use this software 00020 // in a product, an acknowledgment in the product documentation would be 00021 // appreciated but is not required. 00022 // 00023 // 2. Altered source versions must be plainly marked as such, and must not be 00024 // misrepresented as being the original software. 00025 // 00026 // 3. This notice may not be removed or altered from any source 00027 // distribution. 00028 // 00029 // 00030 00031 00032 #ifndef SIM_FOUNDATION_CHECK_POINT_CHECK_POINT_MASTER_H 00033 #define SIM_FOUNDATION_CHECK_POINT_CHECK_POINT_MASTER_H 00034 00035 #include "Sim/Foundation/Resource/ResourceNode.h" 00036 #include "Sim/Foundation/Checkpoint/CheckpointedDataBase.h" 00037 00038 namespace Onikiri 00039 { 00040 class Checkpoint; 00041 00042 // A class managing check-pointed data. 00043 // 'Checkpoint' is a mechanism that backs up states and 00044 // recovers on mis-prediction. 00045 class CheckpointMaster : public PhysicalResourceNode 00046 { 00047 public: 00048 typedef pool_list< Checkpoint* > CheckpointListType; 00049 typedef CheckpointListType::iterator CheckpointListIterator; 00050 00051 typedef pool_vector< CheckpointedDataBase* > CheckpointedDataListType; 00052 typedef CheckpointedDataListType::iterator CheckpoinedtDataListIterator; 00053 00054 enum Slot 00055 { 00056 SLOT_FETCH = 0, 00057 SLOT_RENAME, 00058 SLOT_MAX 00059 }; 00060 00061 // parameter mapping 00062 BEGIN_PARAM_MAP( GetParamPath() ) 00063 PARAM_ENTRY("@Capacity", m_capacity) 00064 END_PARAM_MAP() 00065 00066 BEGIN_RESOURCE_MAP() 00067 END_RESOURCE_MAP() 00068 00069 CheckpointMaster(); 00070 virtual ~CheckpointMaster(); 00071 00072 void Initialize( InitPhase phase ); 00073 00074 // Register check pointed data. 00075 // This method must be called from CheckpointedData::Initialize(). 00076 CheckpointedDataHandle Register( CheckpointedDataBase* data, Slot slot ); 00077 00078 // Create a new checkpoint. 00079 // Returns the pointer of a checkpoint that identifies a generation of check-pointed data. 00080 Checkpoint* CreateCheckpoint(); 00081 00082 // Current data is becked up to 'checkpoint'. 00083 void Backup( Checkpoint* checkpoint, Slot slot ); 00084 00085 // Commits 'checkpoint'. 00086 void Commit( Checkpoint* checkpoint ); 00087 00088 // Flushes 'checkpoint'. 00089 void Flush( Checkpoint* checkpoint ); 00090 00091 // Recover current data to check-pointed data of 'checkpoint'. 00092 void Recover( Checkpoint* checkpoint ); 00093 00094 // accessors 00095 bool CanCreate( int num ) const 00096 { 00097 return m_capacity >= m_checkpoint.size() + num; 00098 } 00099 00100 protected: 00101 size_t m_capacity; // The maximum number of checkpoints. 00102 00103 CheckpointedDataListType m_data; 00104 std::vector<CheckpointedDataListType> m_dataTable; // Indexed by Slot 00105 00106 CheckpointListType m_checkpoint; 00107 00108 // An object pool for checkpoints. 00109 boost::object_pool<Checkpoint> m_checkpointPool; 00110 Checkpoint* ConstructCheckpoint( size_t refSize ); 00111 void DestroyCheckpoint( Checkpoint* cp ); 00112 00113 }; 00114 00115 }; // namespace Onikiri 00116 00117 #endif // SIM_FOUNDATION_CHECK_POINT_CHECK_POINT_MASTER_H 00118