prefix_ senf::ppi::connector::Connector & senf::ppi::connector::Connector::peer()
const
{
+ // The connector is not connected
SENF_ASSERT(peer_);
return *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_;
}
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_;
}
////////////////////////////////////////
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()
remoteThrottled_ = true;
}
-prefix_ void senf::ppi::connector::PassiveConnector::v_unthrottleEvent()
-{}
-
prefix_ void senf::ppi::connector::PassiveConnector::registerRoute(ForwardingRoute & route)
{
routes_.push_back(&route);
prefix_ void senf::ppi::connector::PassiveConnector::emit()
{
+ // No event callback has been registered (onEvent() call missing)
SENF_ASSERT(callback_);
if (!throttled())
callback_();
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)
{}
///////////////////////////////////////////////////////////////////////////
prefix_ senf::Packet senf::ppi::connector::InputConnector::peek()
const
{
+ // Cannot peek() head of empty queue
SENF_ASSERT( ! queue_.empty() );
return queue_.back();
}
////////////////////////////////////////
// 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();
return dynamic_cast<InputConnector&>(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);
}
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()
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)