X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=PPI%2FConnectors.cci;h=ec587ceffa54580e0a2c862ea3c5498d8b5fadbc;hb=d5a72d0b3f6fee56dba6de1c54cafb448ebe3457;hp=e4647d7358e55b2693f00c1408aecff4568446dd;hpb=a1a6c76a214ad1935032826713cabaf9ac57bf07;p=senf.git diff --git a/PPI/Connectors.cci b/PPI/Connectors.cci index e4647d7..ec587ce 100644 --- a/PPI/Connectors.cci +++ b/PPI/Connectors.cci @@ -24,6 +24,7 @@ \brief Connectors inline non-template implementation */ // Custom includes +#include "../Utils/TypeInfo.hh" #include "../Utils/senfassert.hh" #define prefix_ inline @@ -35,17 +36,30 @@ prefix_ senf::ppi::connector::Connector & senf::ppi::connector::Connector::peer() const { - SENF_ASSERT(peer_); + // The connector is not connected + SENF_ASSERT(peer_ && "senf::ppi::connect() call missing"); return *peer_; } prefix_ senf::ppi::module::Module & senf::ppi::connector::Connector::module() const { - SENF_ASSERT(module_); + // The connector is not registered in the module -> probably a route() or noroute() statement is + // missing. + SENF_ASSERT(module_ && "Connector not registered: Missing route() or noroute()"); return *module_; } +prefix_ void senf::ppi::connector::Connector::tracing(TraceState state) +{ + traceState_ = state; +} + +prefix_ senf::ppi::connector::Connector::TraceState senf::ppi::connector::Connector::tracing() +{ + return traceState_; +} + //////////////////////////////////////// // protected members @@ -55,15 +69,17 @@ prefix_ senf::ppi::connector::Connector::Connector() prefix_ senf::ppi::connector::Connector::~Connector() { - if (peer_) + if (connected()) { + Connector & peer (*peer_); peer_->peer_ = 0; + peer.v_init(); + } } -prefix_ void senf::ppi::connector::Connector::connect(Connector & target) +prefix_ bool senf::ppi::connector::Connector::connected() + const { - SENF_ASSERT( ! peer_ && ! target.peer_ ); - peer_ = & target; - target.peer_ = this; + return peer_; } //////////////////////////////////////// @@ -77,12 +93,54 @@ prefix_ void senf::ppi::connector::Connector::setModule(module::Module & module) /////////////////////////////////////////////////////////////////////////// // senf::ppi::connector::PassiveConnector +prefix_ senf::ppi::connector::ActiveConnector & senf::ppi::connector::PassiveConnector::peer() + const +{ + return dynamic_cast(Connector::peer()); +} + prefix_ bool senf::ppi::connector::PassiveConnector::throttled() const { return nativeThrottled_ || remoteThrottled_; } +//////////////////////////////////////// +// private members + +prefix_ void senf::ppi::connector::PassiveConnector::emitThrottle() +{ + throttleTrace("OUT", "throttle"); + if (connected()) + peer().notifyThrottle(); +} + +prefix_ void senf::ppi::connector::PassiveConnector::emitUnthrottle() +{ + throttleTrace("OUT", "unthrottle"); + if (connected()) { + peer().notifyUnthrottle(); + v_unthrottleEvent(); + } +} + +prefix_ void senf::ppi::connector::PassiveConnector::notifyThrottle() +{ + if (!throttled()) { + remoteThrottled_ = true; + emitThrottle(); + } + else + remoteThrottled_ = true; +} + +prefix_ void senf::ppi::connector::PassiveConnector::registerRoute(ForwardingRoute & route) +{ + routes_.push_back(&route); +} + +// public members + prefix_ bool senf::ppi::connector::PassiveConnector::nativeThrottled() const { @@ -94,7 +152,8 @@ prefix_ void senf::ppi::connector::PassiveConnector::throttle() if (!throttled()) { nativeThrottled_ = true; emitThrottle(); - } + } else + nativeThrottled_ = true; } prefix_ void senf::ppi::connector::PassiveConnector::unthrottle() @@ -107,12 +166,6 @@ prefix_ void senf::ppi::connector::PassiveConnector::unthrottle() } -prefix_ senf::ppi::connector::ActiveConnector & senf::ppi::connector::PassiveConnector::peer() - const -{ - return dynamic_cast(Connector::peer()); -} - //////////////////////////////////////// // protected members @@ -122,41 +175,12 @@ prefix_ senf::ppi::connector::PassiveConnector::PassiveConnector() prefix_ void senf::ppi::connector::PassiveConnector::emit() { - SENF_ASSERT(callback_); + // No event callback has been registered (onRequest() call missing) + SENF_ASSERT(callback_ && "senf::ppi::connector::PassiveConnector: missing onRequest()"); if (!throttled()) callback_(); -} - -//////////////////////////////////////// -// private members - -prefix_ void senf::ppi::connector::PassiveConnector::notifyThrottle() -{ - if (!throttled()) { - remoteThrottled_ = true; - emitThrottle(); - } else - remoteThrottled_ = true; -} - -prefix_ void senf::ppi::connector::PassiveConnector::emitThrottle() -{ - peer().notifyThrottle(); -} - -prefix_ void senf::ppi::connector::PassiveConnector::emitUnthrottle() -{ - peer().notifyUnthrottle(); - v_unthrottleEvent(); -} - -prefix_ void senf::ppi::connector::PassiveConnector::v_unthrottleEvent() -{} - -prefix_ void senf::ppi::connector::PassiveConnector::registerRoute(ForwardingRoute & route) -{ - routes_.push_back(&route); + throttleTrace("IN ", "queueing packet"); } /////////////////////////////////////////////////////////////////////////// @@ -181,14 +205,14 @@ prefix_ void senf::ppi::connector::ActiveConnector::onUnthrottle() prefix_ bool senf::ppi::connector::ActiveConnector::throttled() const { - return peer().throttled(); + return ! connected() || peer().throttled(); } //////////////////////////////////////// // protected members prefix_ senf::ppi::connector::ActiveConnector::ActiveConnector() - : throttleCallback_(), unthrottleCallback_(), notifyRoutes_() + : throttleCallback_(), unthrottleCallback_(), notifyRoutes_(), throttled_(false) {} /////////////////////////////////////////////////////////////////////////// @@ -222,7 +246,9 @@ senf::ppi::connector::InputConnector::end() prefix_ senf::Packet senf::ppi::connector::InputConnector::peek() const { - SENF_ASSERT( ! queue_.empty() ); + // Cannot peek() head of empty queue + SENF_ASSERT( ! queue_.empty() && + "senf::ppi::connector::InputConnector: cannot call peek() on empty queue" ); return queue_.back(); } @@ -248,7 +274,7 @@ prefix_ senf::ppi::connector::InputConnector::InputConnector() //////////////////////////////////////// // private members -prefix_ void senf::ppi::connector::InputConnector::enqueue(Packet p) +prefix_ void senf::ppi::connector::InputConnector::enqueue(Packet const & p) { queue_.push_front(p); v_enqueueEvent(); @@ -257,20 +283,22 @@ prefix_ void senf::ppi::connector::InputConnector::enqueue(Packet p) /////////////////////////////////////////////////////////////////////////// // senf::ppi::connector::OutputConnector -prefix_ void senf::ppi::connector::OutputConnector::operator()(Packet p) +prefix_ senf::ppi::connector::InputConnector & senf::ppi::connector::OutputConnector::peer() + const { - peer().enqueue(p); + return dynamic_cast(Connector::peer()); } -prefix_ void senf::ppi::connector::OutputConnector::write(Packet p) +prefix_ void senf::ppi::connector::OutputConnector::operator()(Packet const & p) { - operator()(p); + trace(p, "OUT"); + if (connected()) + peer().enqueue(p); } -prefix_ senf::ppi::connector::InputConnector & senf::ppi::connector::OutputConnector::peer() - const +prefix_ void senf::ppi::connector::OutputConnector::write(Packet const & p) { - return dynamic_cast(Connector::peer()); + operator()(p); } //////////////////////////////////////// @@ -333,12 +361,13 @@ prefix_ senf::ppi::connector::GenericPassiveOutput & senf::ppi::connector::Gener prefix_ bool senf::ppi::connector::GenericActiveInput::boolean_test() const { - return ! empty() || ! peer().throttled(); + return ! empty() || (connected() && ! peer().throttled()); } prefix_ void senf::ppi::connector::GenericActiveInput::request() { - peer().emit(); + if (connected()) + peer().emit(); } prefix_ senf::ppi::connector::GenericActiveInput::GenericActiveInput() @@ -356,7 +385,7 @@ prefix_ senf::ppi::connector::GenericPassiveInput & senf::ppi::connector::Generi prefix_ bool senf::ppi::connector::GenericActiveOutput::boolean_test() const { - return ! peer().throttled(); + return connected() && ! peer().throttled(); } prefix_ void senf::ppi::connector::GenericActiveOutput::connect(GenericPassiveInput & target)