00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef SAMPA_CORE_PERSISTENCE_CXX
00020 #define SAMPA_CORE_PERSISTENCE_CXX
00021
00022 #include "persistence.h"
00023 #include <typeinfo>
00024 #include <cstdio>
00025
00026 #if SAMPA_CONFIG_COLD_RESTART == SAMPA_ENABLED
00027 # define SAMPA_PERSISTENT_DEFAULT_CONSTRUCTOR(prefix, class_scope, class_name, ref_list) \
00028 prefix class_scope::class_name() {\
00029 int sp = 0; \
00030 gc_segment* const gc_stack = storage::gc_stack; \
00031 long const shift = storage::base_address_shift; \
00032 if (gc_stack != NULL) { ref_list storage::gc_stack=&gc_stack[sp]; } \
00033 else if (shift != 0) { ref_list } \
00034 }
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051 # define SAMPA_PERSISTENT_REGISTER(prefix, class_scope, class_name, ref_list) \
00052 SAMPA_PERSISTENT_DEFAULT_CONSTRUCTOR(prefix, class_scope, class_name, ref_list) \
00053 prefix void class_scope::constructor(object* ptr) { new (ptr) class_name; } \
00054 prefix class_descriptor class_scope::self_class(typeid(class_name()).name(), sizeof(class_name), &class_name::constructor)
00055 # define SAMPA_MAKE_PERSISTENT(class_scope, class_name, ref_list)\
00056 SAMPA_PERSISTENT_REGISTER(,class_scope,class_name,ref_list)
00057 # define SAMPA_MAKE_TMPL_PERSISTENT(class_scope, class_name, ref_list)\
00058 SAMPA_PERSISTENT_REGISTER(template<>,class_scope,class_name,ref_list)
00059 # define SAMPA_MAKE_ABSTRACT_PERSISTENT(class_scope, class_name, ref_list)\
00060 SAMPA_PERSISTENT_DEFAULT_CONSTRUCTOR(,class_scope, class_name,ref_list)
00061 # define SAMPA_MAKE_ABSTRACT_TMPL_PERSISTENT(class_scope, class_name, ref_list)\
00062 SAMPA_PERSISTENT_DEFAULT_CONSTRUCTOR(template<>,class_scope,class_name,ref_list)
00063 # else
00064 # define REF(field)
00065 # define REFS(field)
00066 # define NO_REFS
00067 # define SAMPA_MAKE_PERSISTENT(class_scope, class_name, members) class_scope::class_name() {}
00068 # define SAMPA_MAKE_TMPL_PERSISTENT(class_scope, class_name, members) template<> class_scope::class_name() {}
00069 # define SAMPA_MAKE_ABSTRACT_PERSISTENT(class_scope, class_name, members) \
00070 SAMPA_MAKE_PERSISTENT(class_scope, class_name, members)
00071 # define SAMPA_MAKE_ABSTRACT_TMPL_PERSISTENT(class_scope, class_name, members) \
00072 SAMPA_MAKE_TMPL_PERSISTENT(class_scope, class_name, members)
00073 # endif // SAMPA_CONFIG_COLD_RESTART
00074
00075 #endif
00076