switch to new MPL based Fraunhofer FOKUS Public License
[senf.git] / senf / PPI / ModuleManager.cci
1 // $Id$
2 //
3 // Copyright (C) 2007
4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
5 //
6 // The contents of this file are subject to the Fraunhofer FOKUS Public License
7 // Version 1.0 (the "License"); you may not use this file except in compliance
8 // with the License. You may obtain a copy of the License at 
9 // http://senf.berlios.de/license.html
10 //
11 // The Fraunhofer FOKUS Public License Version 1.0 is based on, 
12 // but modifies the Mozilla Public License Version 1.1.
13 // See the full license text for the amendments.
14 //
15 // Software distributed under the License is distributed on an "AS IS" basis, 
16 // WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License 
17 // for the specific language governing rights and limitations under the License.
18 //
19 // The Original Code is Fraunhofer FOKUS code.
20 //
21 // The Initial Developer of the Original Code is Fraunhofer-Gesellschaft e.V. 
22 // (registered association), Hansastraße 27 c, 80686 Munich, Germany.
23 // All Rights Reserved.
24 //
25 // Contributor(s):
26 //   Stefan Bund <g0dil@berlios.de>
27
28 /** \file
29     \brief ModuleManager inline non-template implementation */
30
31 // Custom includes
32 #include <algorithm>
33
34 #define prefix_ inline
35 //-/////////////////////////////////////////////////////////////////////////////////////////////////
36
37 //-/////////////////////////////////////////////////////////////////////////////////////////////////
38 // senf::ppi::ModuleManager
39
40 prefix_ senf::ppi::ModuleManager & senf::ppi::ModuleManager::instance()
41 {
42     static ModuleManager manager;
43     return manager;
44 }
45
46 prefix_ void senf::ppi::ModuleManager::registerModule(module::Module & module)
47 {
48     moduleRegistry_.push_back(&module);
49 }
50
51 prefix_ void senf::ppi::ModuleManager::unregisterModule(module::Module & module)
52 {
53     moduleRegistry_.erase(
54         std::remove(moduleRegistry_.begin(), moduleRegistry_.end(), & module),
55         moduleRegistry_.end());
56 }
57
58 prefix_ void senf::ppi::ModuleManager::registerInitializable(Initializable & i)
59 {
60     initQueue_.push_back(&i);
61     initRunner_.enable();
62     // This call ensures, that the senf::ppi::init() handler is called as next handler
63     // after this handler returns (this works since the senf::ppi::init() handler is registered as
64     // PRE hook and thus has very high priority)
65     senf::scheduler::yield();
66 }
67
68 prefix_ void senf::ppi::ModuleManager::unregisterInitializable(Initializable & i)
69 {
70     initQueue_.erase(
71         std::remove(initQueue_.begin(), initQueue_.end(), & i),
72         initQueue_.end());
73     if (initQueue_.empty())
74         initRunner_.disable();
75 }
76
77 prefix_ bool senf::ppi::ModuleManager::initializableRegistered(Initializable const & i)
78     const
79 {
80     return std::find(initQueue_.begin(), initQueue_.end(), &i) != initQueue_.end();
81 }
82
83 prefix_ bool senf::ppi::ModuleManager::running()
84     const
85 {
86     return running_;
87 }
88
89 prefix_ senf::console::DirectoryNode & senf::ppi::ModuleManager::consoleDir()
90     const
91 {
92     return consoleDir_.node();
93 }
94
95 //-/////////////////////////////////////////////////////////////////////////////////////////////////
96 // senf::ppi::ModuleManager::Initializable
97
98 prefix_ senf::ppi::ModuleManager::Initializable::Initializable()
99 {
100     enqueueInitializable();
101 }
102
103 prefix_ senf::ppi::ModuleManager::Initializable::~Initializable()
104 {
105     dequeueInitializable();
106 }
107
108 prefix_ void senf::ppi::ModuleManager::Initializable::enqueueInitializable()
109 {
110     moduleManager().registerInitializable(*this);
111 }
112
113 prefix_ void senf::ppi::ModuleManager::Initializable::dequeueInitializable()
114 {
115     moduleManager().unregisterInitializable(*this);
116 }
117
118 prefix_ bool senf::ppi::ModuleManager::Initializable::initializationScheduled()
119     const
120 {
121     return moduleManager().initializableRegistered(*this);
122 }
123
124 prefix_ senf::ppi::ModuleManager & senf::ppi::ModuleManager::Initializable::moduleManager()
125     const
126 {
127     return ModuleManager::instance();
128 }
129
130 //-/////////////////////////////////////////////////////////////////////////////////////////////////
131 #undef prefix_
132
133 \f
134 // Local Variables:
135 // mode: c++
136 // fill-column: 100
137 // comment-column: 40
138 // c-file-style: "senf"
139 // indent-tabs-mode: nil
140 // ispell-local-dictionary: "american"
141 // compile-command: "scons -u test"
142 // End: