00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00026 #ifndef HH_SENF_PPI_ModuleManager_
00027 #define HH_SENF_PPI_ModuleManager_ 1
00028
00029
00030 #include <vector>
00031 #include <deque>
00032 #include "predecl.hh"
00033 #include <senf/Scheduler/Scheduler.hh>
00034 #include <senf/Utils/Console/ScopedDirectory.hh>
00035
00036
00037
00038
00039 namespace senf {
00040 namespace ppi {
00041
00047 class ModuleManager
00048 {
00049 public:
00050
00051
00052
00053 struct Initializable
00054 {
00055 Initializable();
00056 virtual ~Initializable();
00057 ModuleManager & moduleManager() const;
00058 void enqueueInitializable();
00059 void dequeueInitializable();
00060 bool initializationScheduled() const;
00061
00062 virtual void v_init() = 0;
00063 };
00064
00065
00067
00068
00069 static ModuleManager & instance();
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081 void init();
00082 void run();
00083
00084 bool running() const;
00085
00086 senf::console::DirectoryNode & consoleDir() const;
00087
00088 private:
00089 ModuleManager();
00090
00091 void registerModule(module::Module & module);
00092 void unregisterModule(module::Module & module);
00093
00094 void registerInitializable(Initializable & i);
00095 void unregisterInitializable(Initializable & i);
00096 bool initializableRegistered(Initializable const & i) const;
00097
00098 void dumpModules(std::ostream & os) const;
00099
00100 typedef std::vector<module::Module *> ModuleRegistry;
00101 typedef std::deque<Initializable *> InitQueue;
00102
00103 #ifndef DOXYGEN
00104 struct RunGuard;
00105 friend class RunGuard;
00106 #endif
00107
00108 ModuleRegistry moduleRegistry_;
00109 bool running_;
00110 bool terminate_;
00111
00112 InitQueue initQueue_;
00113
00114 scheduler::EventHook initRunner_;
00115
00116 senf::console::ScopedDirectory<> consoleDir_;
00117
00118 friend class module::Module;
00119 friend class Initializable;
00120 };
00121
00122 }}
00123
00124
00125 #include "ModuleManager.cci"
00126
00127
00128 #endif
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139