onstartup.h
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef __ONSTARTUP_H
00020 #define __ONSTARTUP_H
00021
00022 #include <vector>
00023 #include <map>
00024 #include "simkerneldefs.h"
00025 #include "cownedobject.h"
00026
00027 NAMESPACE_BEGIN
00028
00029
00030
00031 #define __OPPCONCAT1(x,y) x##y
00032 #define __OPPCONCAT2(prefix,line) __OPPCONCAT1(prefix,line)
00033 #define MAKE_UNIQUE_WITHIN_FILE(prefix) __OPPCONCAT2(prefix,__LINE__)
00034
00035
00036
00037 #define __ONSTARTUP_FUNC MAKE_UNIQUE_WITHIN_FILE(__onstartup_func_)
00038 #define __ONSTARTUP_OBJ MAKE_UNIQUE_WITHIN_FILE(__onstartup_obj_)
00039
00040
00041 #define __FILEUNIQUENAME__ MAKE_UNIQUE_WITHIN_FILE(__uniquename_)
00042
00052 #define EXECUTE_ON_STARTUP(CODE) \
00053 namespace { \
00054 void __ONSTARTUP_FUNC() {CODE;} \
00055 static CodeFragments __ONSTARTUP_OBJ(__ONSTARTUP_FUNC, CodeFragments::STARTUP); \
00056 };
00057
00066
00067 #define EXECUTE_ON_SHUTDOWN(CODE) \
00068 namespace { \
00069 void __ONSTARTUP_FUNC() {CODE;} \
00070 static CodeFragments __ONSTARTUP_OBJ(__ONSTARTUP_FUNC, CodeFragments::SHUTDOWN); \
00071 };
00072
00078 class SIM_API CodeFragments
00079 {
00080 public:
00081 enum Type {STARTUP, SHUTDOWN};
00082 private:
00083 Type type;
00084 void (*code)();
00085 CodeFragments *next;
00086 static CodeFragments *head;
00087 public:
00088 CodeFragments(void (*code)(), Type type);
00089 ~CodeFragments();
00090 static void executeAll(Type type);
00091 };
00092
00093 NAMESPACE_END
00094
00095
00096 #endif
00097