76ba447da4505521b4c3e054eaf337e19ed0d87c
[senf.git] / PPI / ModuleManager.hh
1 // $Id$
2 //
3 // Copyright (C) 2007
4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
5 // Competence Center NETwork research (NET), St. Augustin, GERMANY
6 //     Stefan Bund <g0dil@berlios.de>
7 //
8 // This program is free software; you can redistribute it and/or modify
9 // it under the terms of the GNU General Public License as published by
10 // the Free Software Foundation; either version 2 of the License, or
11 // (at your option) any later version.
12 //
13 // This program is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 // GNU General Public License for more details.
17 //
18 // You should have received a copy of the GNU General Public License
19 // along with this program; if not, write to the
20 // Free Software Foundation, Inc.,
21 // 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22
23 /** \file
24     \brief ModuleManager public header */
25
26 #ifndef HH_ModuleManager_
27 #define HH_ModuleManager_ 1
28
29 // Custom includes
30 #include <vector>
31 #include <deque>
32 #include "predecl.hh"
33 #include "../Scheduler/Scheduler.hh"
34
35 //#include "ModuleManager.mpp"
36 ///////////////////////////////hh.p////////////////////////////////////////
37
38 namespace senf {
39 namespace ppi {
40
41     /** \brief Internal: Module management
42
43         Every module is registered with the ModuleManager. The ModuleManager controls module
44         initialization and execution of the network.
45       */
46     class ModuleManager
47     {
48     public:
49         ///////////////////////////////////////////////////////////////////////////
50         // Types
51
52         struct Initializable
53         {
54             Initializable();
55             virtual ~Initializable();
56             ModuleManager & moduleManager() const;
57             void enqueueInitializable();
58             void dequeueInitializable();
59             bool initializationScheduled() const;
60
61             virtual void v_init() = 0;
62         };
63
64         ///////////////////////////////////////////////////////////////////////////
65         ///\name Structors and default members
66         ///@{
67
68         static ModuleManager & instance();
69
70         // default default constructor
71         // default copy constructor
72         // default copy assignment
73         // default destructor
74
75         // no conversion constructors
76
77         ///@}
78         ///////////////////////////////////////////////////////////////////////////
79
80         void init();                    ///< Called by senf::ppi::init()
81         void run();                     ///< Called by senf::ppi::run()
82
83         bool running() const;           ///< \c true, if the network is running
84
85     private:
86         ModuleManager();
87
88         void registerModule(module::Module & module);
89         void unregisterModule(module::Module & module);
90
91         void registerInitializable(Initializable & i);
92         void unregisterInitializable(Initializable & i);
93         bool initializableRegistered(Initializable const & i) const;
94
95         typedef std::vector<module::Module *> ModuleRegistry;
96         typedef std::deque<Initializable *> InitQueue;
97
98 #ifndef DOXYGEN
99         struct RunGuard;
100         friend class RunGuard;
101 #endif
102
103         ModuleRegistry moduleRegistry_;
104         bool running_;
105         bool terminate_;
106
107         InitQueue initQueue_;
108
109         scheduler::EventHook initRunner_;
110
111         friend class module::Module;
112         friend class Initializable;
113     };
114
115
116 }}
117
118 ///////////////////////////////hh.e////////////////////////////////////////
119 #include "ModuleManager.cci"
120 //#include "ModuleManager.ct"
121 //#include "ModuleManager.cti"
122 #endif
123
124 \f
125 // Local Variables:
126 // mode: c++
127 // fill-column: 100
128 // comment-column: 40
129 // c-file-style: "senf"
130 // indent-tabs-mode: nil
131 // ispell-local-dictionary: "american"
132 // compile-command: "scons -u test"
133 // End: