X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=PPI%2FConnectors.cci;h=e4647d7358e55b2693f00c1408aecff4568446dd;hb=6ba573a99f93543ee32292f79865751b3e9b89a4;hp=3862aab0a93a53f29cd1dd2cb1e05e2a01c07db8;hpb=f539f4271d470794a773a92bacd8ba086c9bc1cd;p=senf.git diff --git a/PPI/Connectors.cci b/PPI/Connectors.cci index 3862aab..e4647d7 100644 --- a/PPI/Connectors.cci +++ b/PPI/Connectors.cci @@ -1,8 +1,8 @@ // $Id$ // -// Copyright (C) 2007 -// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS) -// Kompetenzzentrum fuer Satelitenkommunikation (SatCom) +// Copyright (C) 2007 +// Fraunhofer Institute for Open Communication Systems (FOKUS) +// Competence Center NETwork research (NET), St. Augustin, GERMANY // Stefan Bund // // This program is free software; you can redistribute it and/or modify @@ -24,6 +24,7 @@ \brief Connectors inline non-template implementation */ // Custom includes +#include "../Utils/senfassert.hh" #define prefix_ inline ///////////////////////////////cci.p/////////////////////////////////////// @@ -34,14 +35,14 @@ prefix_ senf::ppi::connector::Connector & senf::ppi::connector::Connector::peer() const { - BOOST_ASSERT(peer_); + SENF_ASSERT(peer_); return *peer_; } prefix_ senf::ppi::module::Module & senf::ppi::connector::Connector::module() const { - BOOST_ASSERT(module_); + SENF_ASSERT(module_); return *module_; } @@ -53,10 +54,14 @@ prefix_ senf::ppi::connector::Connector::Connector() {} prefix_ senf::ppi::connector::Connector::~Connector() -{} +{ + if (peer_) + peer_->peer_ = 0; +} prefix_ void senf::ppi::connector::Connector::connect(Connector & target) { + SENF_ASSERT( ! peer_ && ! target.peer_ ); peer_ = & target; target.peer_ = this; } @@ -86,9 +91,10 @@ prefix_ bool senf::ppi::connector::PassiveConnector::nativeThrottled() prefix_ void senf::ppi::connector::PassiveConnector::throttle() { - if (!throttled()) + if (!throttled()) { + nativeThrottled_ = true; emitThrottle(); - nativeThrottled_ = true; + } } prefix_ void senf::ppi::connector::PassiveConnector::unthrottle() @@ -116,7 +122,7 @@ prefix_ senf::ppi::connector::PassiveConnector::PassiveConnector() prefix_ void senf::ppi::connector::PassiveConnector::emit() { - BOOST_ASSERT(callback_); + SENF_ASSERT(callback_); if (!throttled()) callback_(); } @@ -129,19 +135,9 @@ prefix_ void senf::ppi::connector::PassiveConnector::notifyThrottle() if (!throttled()) { remoteThrottled_ = true; emitThrottle(); - } - else - remoteThrottled_ = true; -} - -prefix_ void senf::ppi::connector::PassiveConnector::notifyUnthrottle() -{ - if (throttled() && !nativeThrottled_) { - remoteThrottled_ = false; - emitUnthrottle(); - } + } else - remoteThrottled_ = false; + remoteThrottled_ = true; } prefix_ void senf::ppi::connector::PassiveConnector::emitThrottle() @@ -158,6 +154,11 @@ prefix_ void senf::ppi::connector::PassiveConnector::emitUnthrottle() prefix_ void senf::ppi::connector::PassiveConnector::v_unthrottleEvent() {} +prefix_ void senf::ppi::connector::PassiveConnector::registerRoute(ForwardingRoute & route) +{ + routes_.push_back(&route); +} + /////////////////////////////////////////////////////////////////////////// // senf::ppi::connector::ActiveConnector @@ -177,6 +178,12 @@ prefix_ void senf::ppi::connector::ActiveConnector::onUnthrottle() unthrottleCallback_ = Callback(); } +prefix_ bool senf::ppi::connector::ActiveConnector::throttled() + const +{ + return peer().throttled(); +} + //////////////////////////////////////// // protected members @@ -187,6 +194,11 @@ prefix_ senf::ppi::connector::ActiveConnector::ActiveConnector() /////////////////////////////////////////////////////////////////////////// // senf::ppi::connector::InputConnector +prefix_ senf::Packet senf::ppi::connector::InputConnector::read() +{ + return operator()(); +} + prefix_ senf::ppi::connector::OutputConnector & senf::ppi::connector::InputConnector::peer() const { @@ -210,7 +222,7 @@ senf::ppi::connector::InputConnector::end() prefix_ senf::Packet senf::ppi::connector::InputConnector::peek() const { - BOOST_ASSERT( ! queue_.empty() ); + SENF_ASSERT( ! queue_.empty() ); return queue_.back(); } @@ -250,6 +262,11 @@ prefix_ void senf::ppi::connector::OutputConnector::operator()(Packet p) peer().enqueue(p); } +prefix_ void senf::ppi::connector::OutputConnector::write(Packet p) +{ + operator()(p); +} + prefix_ senf::ppi::connector::InputConnector & senf::ppi::connector::OutputConnector::peer() const { @@ -263,84 +280,93 @@ prefix_ senf::ppi::connector::OutputConnector::OutputConnector() {} /////////////////////////////////////////////////////////////////////////// -// senf::ppi::connector::PassiveInput +// senf::ppi::connector::GenericPassiveInput -prefix_ senf::ppi::connector::PassiveInput::PassiveInput() +prefix_ senf::ppi::connector::GenericPassiveInput::GenericPassiveInput() : qdisc_(new ThresholdQueueing(1,0)) {} -prefix_ senf::ppi::connector::ActiveOutput & senf::ppi::connector::PassiveInput::peer() +prefix_ senf::ppi::connector::GenericActiveOutput & senf::ppi::connector::GenericPassiveInput::peer() const { - return dynamic_cast(Connector::peer()); + return dynamic_cast(Connector::peer()); } -prefix_ bool senf::ppi::connector::PassiveInput::boolean_test() +prefix_ bool senf::ppi::connector::GenericPassiveInput::boolean_test() const { return ! empty(); } /////////////////////////////////////////////////////////////////////////// -// senf::ppi::connector::PassiveOutput +// senf::ppi::connector::GenericPassiveOutput -prefix_ senf::ppi::connector::ActiveInput & senf::ppi::connector::PassiveOutput::peer() +prefix_ senf::ppi::connector::GenericActiveInput & senf::ppi::connector::GenericPassiveOutput::peer() const { - return dynamic_cast(Connector::peer()); + return dynamic_cast(Connector::peer()); } -prefix_ bool senf::ppi::connector::PassiveOutput::boolean_test() +prefix_ bool senf::ppi::connector::GenericPassiveOutput::boolean_test() const { return true; } -prefix_ void senf::ppi::connector::PassiveOutput::connect(ActiveInput & target) +prefix_ void senf::ppi::connector::GenericPassiveOutput::connect(GenericActiveInput & target) { Connector::connect(target); } +prefix_ senf::ppi::connector::GenericPassiveOutput::GenericPassiveOutput() +{} + /////////////////////////////////////////////////////////////////////////// -// senf::ppi::connector::ActiveInput +// senf::ppi::connector::GenericActiveInput -prefix_ senf::ppi::connector::PassiveOutput & senf::ppi::connector::ActiveInput::peer() +prefix_ senf::ppi::connector::GenericPassiveOutput & senf::ppi::connector::GenericActiveInput::peer() const { - return dynamic_cast(Connector::peer()); + return dynamic_cast(Connector::peer()); } -prefix_ bool senf::ppi::connector::ActiveInput::boolean_test() +prefix_ bool senf::ppi::connector::GenericActiveInput::boolean_test() const { return ! empty() || ! peer().throttled(); } -prefix_ void senf::ppi::connector::ActiveInput::request() +prefix_ void senf::ppi::connector::GenericActiveInput::request() { peer().emit(); } +prefix_ senf::ppi::connector::GenericActiveInput::GenericActiveInput() +{} + /////////////////////////////////////////////////////////////////////////// -// senf::ppi::connector::ActiveOutput +// senf::ppi::connector::GenericActiveOutput -prefix_ senf::ppi::connector::PassiveInput & senf::ppi::connector::ActiveOutput::peer() +prefix_ senf::ppi::connector::GenericPassiveInput & senf::ppi::connector::GenericActiveOutput::peer() const { - return dynamic_cast(Connector::peer()); + return dynamic_cast(Connector::peer()); } -prefix_ bool senf::ppi::connector::ActiveOutput::boolean_test() +prefix_ bool senf::ppi::connector::GenericActiveOutput::boolean_test() const { return ! peer().throttled(); } -prefix_ void senf::ppi::connector::ActiveOutput::connect(PassiveInput & target) +prefix_ void senf::ppi::connector::GenericActiveOutput::connect(GenericPassiveInput & target) { Connector::connect(target); } +prefix_ senf::ppi::connector::GenericActiveOutput::GenericActiveOutput() +{} + ///////////////////////////////cci.e/////////////////////////////////////// #undef prefix_