6d22dc6bac699734d2393267c485a0bebd0d17fd
[senf.git] / senf / 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_SENF_PPI_ModuleManager_
27 #define HH_SENF_PPI_ModuleManager_ 1
28
29 // Custom includes
30 #include <vector>
31 #include <deque>
32 #include "predecl.hh"
33 #include <senf/Scheduler/Scheduler.hh>
34 #include <senf/Utils/Console/ScopedDirectory.hh>
35
36 //#include "ModuleManager.mpp"
37 ///////////////////////////////hh.p////////////////////////////////////////
38
39 namespace senf {
40 namespace ppi {
41
42     /** \brief Internal: Module management
43
44         Every module is registered with the ModuleManager. The ModuleManager controls module
45         initialization and execution of the network.
46       */
47     class ModuleManager
48     {
49     public:
50         ///////////////////////////////////////////////////////////////////////////
51         // Types
52
53         struct Initializable
54         {
55             Initializable();
56             virtual ~Initializable();
57             ModuleManager & moduleManager() const;
58             void enqueueInitializable();
59             void dequeueInitializable();
60             bool initializationScheduled() const;
61
62             virtual void v_init() = 0;
63         };
64
65         ///////////////////////////////////////////////////////////////////////////
66         ///\name Structors and default members
67         ///@{
68
69         static ModuleManager & instance();
70
71         // default default constructor
72         // default copy constructor
73         // default copy assignment
74         // default destructor
75
76         // no conversion constructors
77
78         ///@}
79         ///////////////////////////////////////////////////////////////////////////
80
81         void init();                    ///< Called by senf::ppi::init()
82         void run();                     ///< Called by senf::ppi::run()
83
84         bool running() const;           ///< \c true, if the network is running
85
86         senf::console::DirectoryNode & consoleDir() const;
87
88     private:
89         ModuleManager();
90
91         void registerModule(module::Module & module);
92         void unregisterModule(module::Module & module);
93
94         void registerInitializable(Initializable & i);
95         void unregisterInitializable(Initializable & i);
96         bool initializableRegistered(Initializable const & i) const;
97
98         void dumpModules(std::ostream & os);
99
100         typedef std::vector<module::Module *> ModuleRegistry;
101         typedef std::deque<Initializable *> InitQueue;
102
103 #ifndef DOXYGEN
104         struct RunGuard;
105         friend class RunGuard;
106 #endif
107
108         ModuleRegistry moduleRegistry_;
109         bool running_;
110         bool terminate_;
111
112         InitQueue initQueue_;
113
114         scheduler::EventHook initRunner_;
115
116         senf::console::ScopedDirectory<> consoleDir_;
117
118         friend class module::Module;
119         friend class Initializable;
120     };
121
122
123 }}
124
125 ///////////////////////////////hh.e////////////////////////////////////////
126 #include "ModuleManager.cci"
127 //#include "ModuleManager.ct"
128 //#include "ModuleManager.cti"
129 #endif
130
131 \f
132 // Local Variables:
133 // mode: c++
134 // fill-column: 100
135 // comment-column: 40
136 // c-file-style: "senf"
137 // indent-tabs-mode: nil
138 // ispell-local-dictionary: "american"
139 // compile-command: "scons -u test"
140 // End: