// Custom includes
#include "Route.hh"
#include "Module.hh"
+#include "ModuleManager.hh"
//#include "Connectors.mpp"
#define prefix_
prefix_ void senf::ppi::connector::Connector::connect(Connector & target)
{
- SENF_ASSERT( module_ && ! peer_ && target.module_ && ! target.peer_ );
+ // The connector is not registered -> route() or noroute() statement missing
+ SENF_ASSERT( module_ );
+ // The connector is already connected
+ SENF_ASSERT( ! peer_ );
+ // The target connector is not registered -> route() or noroute() statement missing
+ SENF_ASSERT( target.module_ );
+ // The target connector is already connected
+ SENF_ASSERT( ! target.peer_ );
if (! (packetTypeID() == typeid(void) ||
target.packetTypeID() == typeid(void) ||
packetTypeID() == target.packetTypeID()) )
peer_ = & target;
target.peer_ = this;
+
+ if (! initializationScheduled())
+ enqueueInitializable();
+ if (! peer().initializationScheduled())
+ peer().enqueueInitializable();
+}
+
+prefix_ void senf::ppi::connector::Connector::disconnect()
+{
+ // Cannot disconnected a non-connected connector
+ SENF_ASSERT( peer_ );
+ Connector & peer (*peer_);
+ peer_ = 0;
+ peer.peer_ = 0;
+
+ if (! initializationScheduled())
+ enqueueInitializable();
+ if (! peer.initializationScheduled())
+ peer.enqueueInitializable();
}
prefix_ std::type_info const & senf::ppi::connector::Connector::packetTypeID()
////////////////////////////////////////
// private members
+prefix_ void senf::ppi::connector::PassiveConnector::v_init()
+{
+ Routes::const_iterator i (routes_.begin());
+ Routes::const_iterator const i_end (routes_.end());
+ for (; i != i_end; ++i)
+ if ((*i)->throttled())
+ break;
+ if (i == i_end)
+ remoteThrottled_ = false;
+ if (throttled())
+ emitThrottle();
+ else
+ emitUnthrottle();
+}
+
+prefix_ void senf::ppi::connector::PassiveConnector::v_unthrottleEvent()
+{}
+
prefix_ void senf::ppi::connector::PassiveConnector::notifyUnthrottle()
{
if (throttled() && !nativeThrottled_) {
////////////////////////////////////////
// private members
+prefix_ void senf::ppi::connector::ActiveConnector::v_init()
+{
+ if (! connected())
+ notifyThrottle();
+}
+
prefix_ void senf::ppi::connector::ActiveConnector::notifyThrottle()
{
- if (throttleCallback_)
- throttleCallback_();
- NotifyRoutes::const_iterator i (notifyRoutes_.begin());
- NotifyRoutes::const_iterator const i_end (notifyRoutes_.end());
- for (; i != i_end; ++i)
- (*i)->notifyThrottle();
+ if (! throttled_) {
+ throttled_ = true;
+ if (throttleCallback_)
+ throttleCallback_();
+ NotifyRoutes::const_iterator i (notifyRoutes_.begin());
+ NotifyRoutes::const_iterator const i_end (notifyRoutes_.end());
+ for (; i != i_end; ++i)
+ (*i)->notifyThrottle();
+ }
}
prefix_ void senf::ppi::connector::ActiveConnector::notifyUnthrottle()
{
- if (unthrottleCallback_)
- unthrottleCallback_();
- NotifyRoutes::const_iterator i (notifyRoutes_.begin());
- NotifyRoutes::const_iterator const i_end (notifyRoutes_.end());
- for (; i != i_end; ++i)
- (*i)->notifyUnthrottle();
+ if (throttled_) {
+ throttled_ = false;
+ if (unthrottleCallback_)
+ unthrottleCallback_();
+ NotifyRoutes::const_iterator i (notifyRoutes_.begin());
+ NotifyRoutes::const_iterator const i_end (notifyRoutes_.end());
+ for (; i != i_end; ++i)
+ (*i)->notifyUnthrottle();
+ }
}
prefix_ void senf::ppi::connector::ActiveConnector::registerRoute(ForwardingRoute & route)