X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=senf%2FPPI%2FConnectors.cc;h=9b0232db300d188c5947633206c402825234d974;hb=93d9568d448749dc187e7622b733a4a3caa319df;hp=0ee44f51765c428bdeb451fda20ceec7e2a31b86;hpb=32bf29e751e6c73ca2bc78c21996e4320e934673;p=senf.git diff --git a/senf/PPI/Connectors.cc b/senf/PPI/Connectors.cc index 0ee44f5..9b0232d 100644 --- a/senf/PPI/Connectors.cc +++ b/senf/PPI/Connectors.cc @@ -27,18 +27,27 @@ #include "Connectors.ih" // Custom includes -#include "Route.hh" -#include "Module.hh" #include "ModuleManager.hh" -#include +#include //#include "Connectors.mpp" #define prefix_ -///////////////////////////////cc.p//////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// // 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 @@ -57,6 +66,7 @@ prefix_ void senf::ppi::connector::Connector::connect(Connector & target) SENF_ASSERT( ! target.peer_, "senf::ppi::connector::Connector::connect(): (target) " "duplicate connection" ); + if (! (packetTypeID() == typeid(void) || target.packetTypeID() == typeid(void) || packetTypeID() == target.packetTypeID()) ) @@ -73,6 +83,10 @@ prefix_ void senf::ppi::connector::Connector::connect(Connector & target) enqueueInitializable(); if (! peer().initializationScheduled()) peer().enqueueInitializable(); + + v_connected(); + peer_->v_connected(); + } senf::ppi::connector::Connector::TraceState senf::ppi::connector::Connector::traceState_ ( @@ -190,14 +204,45 @@ prefix_ std::type_info const & senf::ppi::connector::Connector::packetTypeID() return typeid(void); } +prefix_ void senf::ppi::connector::Connector::unregisterConnector() +{ + if (module_) + module_->unregisterConnector(*this); +} + +prefix_ void senf::ppi::connector::Connector::setModule(module::Module & module) +{ + module_ = &module; +} + prefix_ void senf::ppi::connector::Connector::v_disconnected() - const {} -/////////////////////////////////////////////////////////////////////////// +prefix_ void senf::ppi::connector::Connector::v_connected() +{} + +//-///////////////////////////////////////////////////////////////////////////////////////////////// // 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(); +} + +prefix_ void senf::ppi::connector::PassiveConnector::v_disconnected() +{ + Connector::v_disconnected(); + peer_ = 0; +} + +prefix_ void senf::ppi::connector::PassiveConnector::v_connected() +{ + Connector::v_connected(); + peer_ = & dynamic_cast(Connector::peer()); +} + +//-///////////////////////////////////////////////////////////////////////////////////////////////// // private members prefix_ void senf::ppi::connector::PassiveConnector::v_init() @@ -215,6 +260,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() {} @@ -229,10 +286,28 @@ prefix_ void senf::ppi::connector::PassiveConnector::notifyUnthrottle() SENF_PPI_THROTTLE_TRACE("OUT", "not forwarding unthrottle event"); } -/////////////////////////////////////////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// // 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(); +} + +prefix_ void senf::ppi::connector::ActiveConnector::v_disconnected() +{ + Connector::v_disconnected(); + peer_ = 0; +} + +prefix_ void senf::ppi::connector::ActiveConnector::v_connected() +{ + Connector::v_connected(); + peer_ = & dynamic_cast(Connector::peer()); +} + +//-///////////////////////////////////////////////////////////////////////////////////////////////// // private members prefix_ void senf::ppi::connector::ActiveConnector::v_init() @@ -281,24 +356,38 @@ prefix_ void senf::ppi::connector::ActiveConnector::unregisterRoute(ForwardingRo notifyRoutes_.erase(i); } -/////////////////////////////////////////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// // senf::ppi::connector::InputConnector 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; } -//////////////////////////////////////// +prefix_ void senf::ppi::connector::InputConnector::v_disconnected() +{ + Connector::v_disconnected(); + peer_ = 0; +} + +prefix_ void senf::ppi::connector::InputConnector::v_connected() +{ + Connector::v_connected(); + peer_ = & dynamic_cast(Connector::peer()); +} + +//-///////////////////////////////////////////////////////////////////////////////////////////////// // private members prefix_ void senf::ppi::connector::InputConnector::v_requestEvent() @@ -310,10 +399,25 @@ prefix_ void senf::ppi::connector::InputConnector::v_enqueueEvent() prefix_ void senf::ppi::connector::InputConnector::v_dequeueEvent() {} -/////////////////////////////////////////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// +// senf::ppi::connector::OutputConnector + +prefix_ void senf::ppi::connector::OutputConnector::v_disconnected() +{ + Connector::v_disconnected(); + peer_ = 0; +} + +prefix_ void senf::ppi::connector::OutputConnector::v_connected() +{ + Connector::v_connected(); + peer_ = & dynamic_cast(Connector::peer()); +} + +//-///////////////////////////////////////////////////////////////////////////////////////////////// // senf::ppi::connector::GenericActiveInput -//////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// // private members prefix_ void senf::ppi::connector::GenericActiveInput::v_requestEvent() @@ -321,21 +425,42 @@ prefix_ void senf::ppi::connector::GenericActiveInput::v_requestEvent() request(); } -/////////////////////////////////////////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// // senf::ppi::connector::GenericPassiveInput -//////////////////////////////////////// +prefix_ void senf::ppi::connector::GenericPassiveInput::v_disconnected() +{ + PassiveConnector::v_disconnected(); + InputConnector::v_disconnected(); + peer_ = 0; +} + +prefix_ void senf::ppi::connector::GenericPassiveInput::v_connected() +{ + PassiveConnector::v_connected(); + InputConnector::v_connected(); + peer_ = & dynamic_cast(Connector::peer()); +} + +//-///////////////////////////////////////////////////////////////////////////////////////////////// // private members 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() @@ -350,7 +475,59 @@ prefix_ void senf::ppi::connector::GenericPassiveInput::v_unthrottleEvent() } } -///////////////////////////////cc.e//////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// +// senf::ppi::connector::GenericPassiveOutput + +prefix_ void senf::ppi::connector::GenericPassiveOutput::v_disconnected() +{ + PassiveConnector::v_disconnected(); + OutputConnector::v_disconnected(); + peer_ = 0; +} + +prefix_ void senf::ppi::connector::GenericPassiveOutput::v_connected() +{ + PassiveConnector::v_connected(); + OutputConnector::v_connected(); + peer_ = & dynamic_cast(Connector::peer()); +} + +//-///////////////////////////////////////////////////////////////////////////////////////////////// +// senf::ppi::connector::GenericActiveInput + +prefix_ void senf::ppi::connector::GenericActiveInput::v_disconnected() +{ + ActiveConnector::v_disconnected(); + InputConnector::v_disconnected(); + peer_ = 0; +} + +prefix_ void senf::ppi::connector::GenericActiveInput::v_connected() +{ + ActiveConnector::v_connected(); + InputConnector::v_connected(); + peer_ = & dynamic_cast(Connector::peer()); +} + +//-///////////////////////////////////////////////////////////////////////////////////////////////// +// senf::ppi::connector::GenericActiveOutput + +prefix_ void senf::ppi::connector::GenericActiveOutput::v_disconnected() +{ + ActiveConnector::v_disconnected(); + OutputConnector::v_disconnected(); + peer_ = 0; +} + +prefix_ void senf::ppi::connector::GenericActiveOutput::v_connected() +{ + ActiveConnector::v_connected(); + OutputConnector::v_connected(); + peer_ = & dynamic_cast(Connector::peer()); +} + + +//-///////////////////////////////////////////////////////////////////////////////////////////////// #undef prefix_ //#include "Connectors.mpp"