Packets: Add StringParser ostream operation
[senf.git] / PPI / ModuleManager.hh
index 6c8d291..14ad1a9 100644 (file)
 /** \file
     \brief ModuleManager public header */
 
-#ifndef HH_ModuleManager_
-#define HH_ModuleManager_ 1
+#ifndef HH_SENF_PPI_ModuleManager_
+#define HH_SENF_PPI_ModuleManager_ 1
 
 // Custom includes
 #include <vector>
+#include <deque>
 #include "predecl.hh"
+#include "../Scheduler/Scheduler.hh"
 
 //#include "ModuleManager.mpp"
 ///////////////////////////////hh.p////////////////////////////////////////
@@ -45,6 +47,21 @@ namespace ppi {
     {
     public:
         ///////////////////////////////////////////////////////////////////////////
+        // Types
+
+        struct Initializable
+        {
+            Initializable();
+            virtual ~Initializable();
+            ModuleManager & moduleManager() const;
+            void enqueueInitializable();
+            void dequeueInitializable();
+            bool initializationScheduled() const;
+
+            virtual void v_init() = 0;
+        };
+
+        ///////////////////////////////////////////////////////////////////////////
         ///\name Structors and default members
         ///@{
 
@@ -71,7 +88,12 @@ namespace ppi {
         void registerModule(module::Module & module);
         void unregisterModule(module::Module & module);
 
+        void registerInitializable(Initializable & i);
+        void unregisterInitializable(Initializable & i);
+        bool initializableRegistered(Initializable const & i) const;
+
         typedef std::vector<module::Module *> ModuleRegistry;
+        typedef std::deque<Initializable *> InitQueue;
 
 #ifndef DOXYGEN
         struct RunGuard;
@@ -82,7 +104,12 @@ namespace ppi {
         bool running_;
         bool terminate_;
 
+        InitQueue initQueue_;
+
+        scheduler::EventHook initRunner_;
+
         friend class module::Module;
+        friend class Initializable;
     };