// $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////////////////////////////////////////
namespace senf {
namespace ppi {
- /** \brief
+ /** \brief Internal: Module management
+
+ Every module is registered with the ModuleManager. The ModuleManager controls module
+ initialization and execution of the network.
*/
class ModuleManager
{
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
///@{
///@}
///////////////////////////////////////////////////////////////////////////
+ void init(); ///< Called by senf::ppi::init()
+ void run(); ///< Called by senf::ppi::run()
+
+ bool running() const; ///< \c true, if the network is running
+
+ private:
+ ModuleManager();
+
void registerModule(module::Module & module);
void unregisterModule(module::Module & module);
-
- void init();
- void run();
- protected:
+ void registerInitializable(Initializable & i);
+ void unregisterInitializable(Initializable & i);
+ bool initializableRegistered(Initializable const & i) const;
- private:
typedef std::vector<module::Module *> ModuleRegistry;
+ typedef std::deque<Initializable *> InitQueue;
+
+#ifndef DOXYGEN
+ struct RunGuard;
+ friend class RunGuard;
+#endif
ModuleRegistry moduleRegistry_;
+ bool running_;
+ bool terminate_;
+
+ InitQueue initQueue_;
+
+ scheduler::EventHook initRunner_;
+
+ friend class module::Module;
+ friend class Initializable;
};