X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=senf%2FPPI%2FConnectors.cc;h=2a876b63fdcb6af422a2d88ac6ffe568d646b9dd;hb=9bc655e14d2d8c204ed835896cb51e42d49bd68f;hp=0ee44f51765c428bdeb451fda20ceec7e2a31b86;hpb=32bf29e751e6c73ca2bc78c21996e4320e934673;p=senf.git diff --git a/senf/PPI/Connectors.cc b/senf/PPI/Connectors.cc index 0ee44f5..2a876b6 100644 --- a/senf/PPI/Connectors.cc +++ b/senf/PPI/Connectors.cc @@ -39,6 +39,17 @@ /////////////////////////////////////////////////////////////////////////// // senf::ppi::connector::Connector +prefix_ senf::ppi::connector::Connector::~Connector() +{ + if (connected()) { + Connector & peer (*peer_); + peer_->peer_ = 0; + if (! peer.initializationScheduled()) + peer.enqueueInitializable(); + peer.v_disconnected(); + } +} + prefix_ void senf::ppi::connector::Connector::connect(Connector & target) { // The connector is not registered -> route() or noroute() statement missing @@ -197,6 +208,12 @@ prefix_ void senf::ppi::connector::Connector::v_disconnected() /////////////////////////////////////////////////////////////////////////// // senf::ppi::connector::PassiveConnector +prefix_ senf::ppi::connector::PassiveConnector::~PassiveConnector() +{ + // Must be here and NOT in base so it is called before destructing the routes_ member + unregisterConnector(); +} + //////////////////////////////////////// // private members @@ -215,6 +232,18 @@ prefix_ void senf::ppi::connector::PassiveConnector::v_init() emitUnthrottle(); } +prefix_ void senf::ppi::connector::PassiveConnector::registerRoute(ForwardingRoute & route) +{ + routes_.push_back(&route); +} + +prefix_ void senf::ppi::connector::PassiveConnector::unregisterRoute(ForwardingRoute & route) +{ + Routes::iterator i (std::find(routes_.begin(), routes_.end(), &route)); + if (i != routes_.end()) + routes_.erase(i); +} + prefix_ void senf::ppi::connector::PassiveConnector::v_unthrottleEvent() {} @@ -232,6 +261,12 @@ prefix_ void senf::ppi::connector::PassiveConnector::notifyUnthrottle() /////////////////////////////////////////////////////////////////////////// // senf::ppi::connector::ActiveConnector +prefix_ senf::ppi::connector::ActiveConnector::~ActiveConnector() +{ + // Must be here and NOT in base so it is called before destructing the routes_ member + unregisterConnector(); +} + //////////////////////////////////////// // private members @@ -288,14 +323,16 @@ prefix_ senf::Packet senf::ppi::connector::InputConnector::operator()() { if (empty()) v_requestEvent(); - Packet p; if (! empty()) { - p = peek(); + Packet p ( queue_.back()); queue_.pop_back(); v_dequeueEvent(); + SENF_PPI_TRACE(p, "IN "); + return p; + } else { + SENF_PPI_TRACE(Packet(), "IN "); + return Packet(); } - SENF_PPI_TRACE(p, "IN "); - return p; } //////////////////////////////////////// @@ -330,12 +367,19 @@ prefix_ void senf::ppi::connector::GenericActiveInput::v_requestEvent() prefix_ void senf::ppi::connector::GenericPassiveInput::v_enqueueEvent() { emit(); - qdisc_->update(*this, QueueingDiscipline::ENQUEUE); + if (qdisc_) + qdisc_->update(*this, QueueingDiscipline::ENQUEUE); } prefix_ void senf::ppi::connector::GenericPassiveInput::v_dequeueEvent() { - qdisc_->update(*this, QueueingDiscipline::DEQUEUE); + if (qdisc_) + qdisc_->update(*this, QueueingDiscipline::DEQUEUE); +} + +prefix_ void senf::ppi::connector::GenericPassiveInput::qdisc(QueueingDiscipline::None_t) +{ + qdisc_.reset( 0); } prefix_ void senf::ppi::connector::GenericPassiveInput::v_unthrottleEvent()