Packets: Fix VariantParser invalid parser access bug
[senf.git] / PPI / ModuleManager.hh
index 08d1cce..14ad1a9 100644 (file)
@@ -1,8 +1,8 @@
 // $Id$
 //
-// Copyright (C) 2007 
-// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
-// Kompetenzzentrum fuer Satelitenkommunikation (SatCom)
+// Copyright (C) 2007
+// Fraunhofer Institute for Open Communication Systems (FOKUS)
+// Competence Center NETwork research (NET), St. Augustin, GERMANY
 //     Stefan Bund <g0dil@berlios.de>
 //
 // This program is free software; you can redistribute it and/or modify
 /** \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
         ///@{
 
@@ -70,8 +87,13 @@ 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;
     };