4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
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
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.
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.
19 // The Original Code is Fraunhofer FOKUS code.
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.
26 // Stefan Bund <g0dil@berlios.de>
29 \brief ModuleManager inline non-template implementation */
34 #define prefix_ inline
35 //-/////////////////////////////////////////////////////////////////////////////////////////////////
37 //-/////////////////////////////////////////////////////////////////////////////////////////////////
38 // senf::ppi::ModuleManager
40 prefix_ senf::ppi::ModuleManager & senf::ppi::ModuleManager::instance()
42 static ModuleManager manager;
46 prefix_ void senf::ppi::ModuleManager::registerModule(module::Module & module)
48 moduleRegistry_.push_back(&module);
51 prefix_ void senf::ppi::ModuleManager::unregisterModule(module::Module & module)
53 moduleRegistry_.erase(
54 std::remove(moduleRegistry_.begin(), moduleRegistry_.end(), & module),
55 moduleRegistry_.end());
58 prefix_ void senf::ppi::ModuleManager::registerInitializable(Initializable & i)
60 initQueue_.push_back(&i);
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();
68 prefix_ void senf::ppi::ModuleManager::unregisterInitializable(Initializable & i)
71 std::remove(initQueue_.begin(), initQueue_.end(), & i),
73 if (initQueue_.empty())
74 initRunner_.disable();
77 prefix_ bool senf::ppi::ModuleManager::initializableRegistered(Initializable const & i)
80 return std::find(initQueue_.begin(), initQueue_.end(), &i) != initQueue_.end();
83 prefix_ bool senf::ppi::ModuleManager::running()
89 prefix_ senf::console::DirectoryNode & senf::ppi::ModuleManager::consoleDir()
92 return consoleDir_.node();
95 //-/////////////////////////////////////////////////////////////////////////////////////////////////
96 // senf::ppi::ModuleManager::Initializable
98 prefix_ senf::ppi::ModuleManager::Initializable::Initializable()
100 enqueueInitializable();
103 prefix_ senf::ppi::ModuleManager::Initializable::~Initializable()
105 dequeueInitializable();
108 prefix_ void senf::ppi::ModuleManager::Initializable::enqueueInitializable()
110 moduleManager().registerInitializable(*this);
113 prefix_ void senf::ppi::ModuleManager::Initializable::dequeueInitializable()
115 moduleManager().unregisterInitializable(*this);
118 prefix_ bool senf::ppi::ModuleManager::Initializable::initializationScheduled()
121 return moduleManager().initializableRegistered(*this);
124 prefix_ senf::ppi::ModuleManager & senf::ppi::ModuleManager::Initializable::moduleManager()
127 return ModuleManager::instance();
130 //-/////////////////////////////////////////////////////////////////////////////////////////////////
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"