X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=PPI%2FConnectors.cci;h=3f24b5d99521d0b84f041ea4c9223141777d5a03;hb=b8ca4a544cce3e6023bb56b712a03d6362f2bb79;hp=8db9cd913faa57ded2410e5052d972d4365e5138;hpb=10985d71f77b627bc4da543d7114feb7c4529329;p=senf.git diff --git a/PPI/Connectors.cci b/PPI/Connectors.cci index 8db9cd9..3f24b5d 100644 --- a/PPI/Connectors.cci +++ b/PPI/Connectors.cci @@ -36,6 +36,7 @@ prefix_ senf::ppi::connector::Connector & senf::ppi::connector::Connector::peer() const { + // The connector is not connected SENF_ASSERT(peer_); return *peer_; } @@ -43,6 +44,8 @@ prefix_ senf::ppi::connector::Connector & senf::ppi::connector::Connector::peer( prefix_ senf::ppi::module::Module & senf::ppi::connector::Connector::module() const { + // The connector is not registered in the module -> probably a route() or noroute() statement is + // missing. SENF_ASSERT(module_); return *module_; } @@ -56,8 +59,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_ bool senf::ppi::connector::Connector::connected() + const +{ + return peer_; } //////////////////////////////////////// @@ -88,13 +100,16 @@ prefix_ bool senf::ppi::connector::PassiveConnector::throttled() prefix_ void senf::ppi::connector::PassiveConnector::emitThrottle() { - peer().notifyThrottle(); + if (connected()) + peer().notifyThrottle(); } prefix_ void senf::ppi::connector::PassiveConnector::emitUnthrottle() { - peer().notifyUnthrottle(); - v_unthrottleEvent(); + if (connected()) { + peer().notifyUnthrottle(); + v_unthrottleEvent(); + } } prefix_ void senf::ppi::connector::PassiveConnector::notifyThrottle() @@ -107,9 +122,6 @@ prefix_ void senf::ppi::connector::PassiveConnector::notifyThrottle() remoteThrottled_ = true; } -prefix_ void senf::ppi::connector::PassiveConnector::v_unthrottleEvent() -{} - prefix_ void senf::ppi::connector::PassiveConnector::registerRoute(ForwardingRoute & route) { routes_.push_back(&route); @@ -150,6 +162,7 @@ prefix_ senf::ppi::connector::PassiveConnector::PassiveConnector() prefix_ void senf::ppi::connector::PassiveConnector::emit() { + // No event callback has been registered (onEvent() call missing) SENF_ASSERT(callback_); if (!throttled()) callback_(); @@ -177,14 +190,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) {} /////////////////////////////////////////////////////////////////////////// @@ -218,6 +231,7 @@ senf::ppi::connector::InputConnector::end() prefix_ senf::Packet senf::ppi::connector::InputConnector::peek() const { + // Cannot peek() head of empty queue SENF_ASSERT( ! queue_.empty() ); return queue_.back(); } @@ -244,7 +258,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(); @@ -259,12 +273,13 @@ prefix_ senf::ppi::connector::InputConnector & senf::ppi::connector::OutputConne return dynamic_cast(Connector::peer()); } -prefix_ void senf::ppi::connector::OutputConnector::operator()(Packet p) +prefix_ void senf::ppi::connector::OutputConnector::operator()(Packet const & p) { - peer().enqueue(p); + if (connected()) + peer().enqueue(p); } -prefix_ void senf::ppi::connector::OutputConnector::write(Packet p) +prefix_ void senf::ppi::connector::OutputConnector::write(Packet const & p) { operator()(p); } @@ -329,12 +344,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() @@ -352,7 +368,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)