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 // Thorsten Horstmann <tho@berlios.de>
29 \brief QueueingSocketSink non-inline template implementation */
31 //#include "QueueingSocketSink.ih"
34 #include <senf/Utils/Console/ParsedCommand.hh>
37 //-/////////////////////////////////////////////////////////////////////////////////////////////////
39 //-/////////////////////////////////////////////////////////////////////////////////////////////////
40 // senf::ppi::QueueingAlgorithmRegistry
42 template <class QAlgorithm>
43 prefix_ void senf::ppi::QueueingAlgorithmRegistry::registerQAlgorithm(std::string key)
45 if (qAlgoMap_.find( key) == qAlgoMap_.end() )
46 qAlgoMap_.insert(key, new detail::QueueingAlgorithmRegistry_Entry<QAlgorithm>() );
48 throw Exception("Duplicated QAlgorithm Registration ") << key;
51 //-/////////////////////////////////////////////////////////////////////////////////////////////////
52 // senf::ppi::detail::QueueingAlgorithmRegistry_Entry<QAlgorithm>
54 template <class QAlgorithm>
55 prefix_ senf::ppi::QueueingAlgorithm::ptr senf::ppi::detail::QueueingAlgorithmRegistry_Entry<QAlgorithm>::create()
58 return QAlgorithm::create();
61 //-/////////////////////////////////////////////////////////////////////////////////////////////////
62 // senf::ppi::module::PassiveQueueingSocketSink<Writer>
64 template <class Writer>
65 prefix_ senf::ppi::module::PassiveQueueingSocketSink<Writer>::PassiveQueueingSocketSink(Handle const & handle, QueueingAlgorithm::ptr qAlgorithm)
67 handle_( handle), writer_( ),
69 event_( handle_, IOEvent::Write)
71 namespace fty = console::factory;
72 dir.add( "active", qAlgo_->consoleDir());
73 dir.add( "set", fty::Command(
74 &PassiveQueueingSocketSink<Writer>::setQAlgorithm, this) );
75 dir.add( "list", fty::Command(
76 &QueueingAlgorithmRegistry::dump, &QueueingAlgorithmRegistry::instance()));
77 registerEvent( event_, &PassiveQueueingSocketSink::writable );
78 event_.enabled( false);
80 input.onRequest( &PassiveQueueingSocketSink::write);
81 input.qdisc( QueueingDiscipline::NONE);
85 template <class Writer>
86 prefix_ void senf::ppi::module::PassiveQueueingSocketSink<Writer>::handle(Handle const & handle)
89 event_.set( handle_, IOEvent::Write);
94 template <class Writer>
95 prefix_ void senf::ppi::module::PassiveQueueingSocketSink<Writer>::write()
97 PacketType p ( input());
98 if (qAlgo_->size() > 0) {
102 if (! writer_( handle_, p)) {
103 if (qAlgo_->enqueue( p) && !event_.enabled()) {
104 event_.enabled( true);
109 template <class Writer>
110 prefix_ void senf::ppi::module::PassiveQueueingSocketSink<Writer>::writable()
112 PacketType p (qAlgo_->dequeue());
114 writer_( handle_, p);
115 if (qAlgo_->size() == 0) {
116 event_.enabled( false);
120 template <class Writer>
121 prefix_ void senf::ppi::module::PassiveQueueingSocketSink<Writer>::checkThrottle()
129 template <class Writer>
130 prefix_ void senf::ppi::module::PassiveQueueingSocketSink<Writer>::qAlgorithm(QueueingAlgorithm::ptr qAlgorithm)
132 // dir.remove( "active");
133 qAlgo_.reset( qAlgorithm);
134 dir.add( "active", qAlgo_->consoleDir());
135 if (event_.enabled())
136 event_.enabled( false);
139 template <class Writer>
140 prefix_ void senf::ppi::module::PassiveQueueingSocketSink<Writer>::setQAlgorithm(std::string const & key)
142 qAlgorithm( QueueingAlgorithmRegistry::instance().createQAlgorithm( key));
145 //-/////////////////////////////////////////////////////////////////////////////////////////////////
152 // comment-column: 40
153 // c-file-style: "senf"
154 // indent-tabs-mode: nil
155 // ispell-local-dictionary: "american"
156 // compile-command: "scons -u test"