X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=senf%2FPPI%2FQueueingSocketSink.ct;h=6a1e831cad5b111b279c9d9618ca6b2924e77e5c;hb=78a6e233083efa63a9cd0684a92abc64202a9ee7;hp=027673d784b041f83d53f782b2c44d71ebde65cd;hpb=ed55b722ff15975fb0b090a1b132c9b830829124;p=senf.git diff --git a/senf/PPI/QueueingSocketSink.ct b/senf/PPI/QueueingSocketSink.ct index 027673d..6a1e831 100644 --- a/senf/PPI/QueueingSocketSink.ct +++ b/senf/PPI/QueueingSocketSink.ct @@ -31,69 +31,62 @@ ///////////////////////////////ct.p//////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// -// senf::ppi::FIFOQueueingAlgorithm +// senf::ppi::QueueingAlgorithmRegistry -template -prefix_ senf::ppi::FIFOQueueingAlgorithm::FIFOQueueingAlgorithm(unsigned size) - : size_( size) -{ } - -template -prefix_ PacketType senf::ppi::FIFOQueueingAlgorithm::dequeue() +template +prefix_ void senf::ppi::QueueingAlgorithmRegistry::registerQAlgorithm(std::string key) { - if (queue_.size() > 0) { - PacketType const & p = queue_.front(); - queue_.pop(); - return p; - } - return PacketType(); + if (qAlgoMap_.find( key) == qAlgoMap_.end() ) + qAlgoMap_.insert(key, new detail::QueueingAlgorithmRegistry_Entry() ); + else + throw Exception("Duplicated QAlgorithm Registration ") << key; } -template -prefix_ bool senf::ppi::FIFOQueueingAlgorithm::enqueue(PacketType const & packet) -{ - if (queue_.size() < size_) { - queue_.push( packet); - return true; - } - return false; -} +/////////////////////////////////////////////////////////////////////////// +// senf::ppi::detail::QueueingAlgorithmRegistry_Entry -template -prefix_ void senf::ppi::FIFOQueueingAlgorithm::clear() +template +prefix_ senf::ppi::QueueingAlgorithm::ptr senf::ppi::detail::QueueingAlgorithmRegistry_Entry::create() + const { - while (! queue_.empty()) - queue_.pop(); + return QAlgorithm::create(); } /////////////////////////////////////////////////////////////////////////// // senf::ppi::module::PassiveQueueingSocketSink template -template -prefix_ senf::ppi::module::PassiveQueueingSocketSink::PassiveQueueingSocketSink(Handle handle, QAlgorithm const & qAlgorithm) - : handle_( handle), writer_( ), - qAlgo_( new QAlgorithm(qAlgorithm)), +prefix_ senf::ppi::module::PassiveQueueingSocketSink::PassiveQueueingSocketSink(Handle const & handle, QueueingAlgorithm::ptr qAlgorithm) + : dir( this), + handle_( handle), writer_( ), + qAlgo_( qAlgorithm), event_( handle_, IOEvent::Write) { + namespace fty = console::factory; + dir.add( "active", qAlgo_->consoleDir()); + dir.add( "set", fty::Command( + &PassiveQueueingSocketSink::setQAlgorithm, this) ); + dir.add( "list", fty::Command( + &QueueingAlgorithmRegistry::dump, &QueueingAlgorithmRegistry::instance())); registerEvent( event_, &PassiveQueueingSocketSink::writable ); event_.enabled( false); noroute(input); input.onRequest( &PassiveQueueingSocketSink::write); + input.qdisc( QueueingDiscipline::NONE); checkThrottle(); } template prefix_ void senf::ppi::module::PassiveQueueingSocketSink::write() { - PacketType p ( input.read()); + PacketType p ( input()); if (qAlgo_->size() > 0) { qAlgo_->enqueue( p); return; } if (! writer_( handle_, p)) { if (qAlgo_->enqueue( p) && !event_.enabled()) { - event_.enabled( true); + event_.enabled( true); } } } @@ -118,6 +111,22 @@ prefix_ void senf::ppi::module::PassiveQueueingSocketSink::checkThrottle input.throttle(); } +template +prefix_ void senf::ppi::module::PassiveQueueingSocketSink::qAlgorithm(QueueingAlgorithm::ptr qAlgorithm) +{ +// dir.remove( "active"); + qAlgo_.reset( qAlgorithm); + dir.add( "active", qAlgo_->consoleDir()); + if (event_.enabled()) + event_.enabled( false); +} + +template +prefix_ void senf::ppi::module::PassiveQueueingSocketSink::setQAlgorithm(std::string const & key) +{ + qAlgorithm( QueueingAlgorithmRegistry::instance().createQAlgorithm( key)); +} + ///////////////////////////////ct.e//////////////////////////////////////// #undef prefix_ @@ -130,4 +139,4 @@ prefix_ void senf::ppi::module::PassiveQueueingSocketSink::checkThrottle // indent-tabs-mode: nil // ispell-local-dictionary: "american" // compile-command: "scons -u test" -// End: +// End::