\brief Connectors inline non-template implementation */
// Custom includes
-#include "../Utils/TypeInfo.hh"
-#include "../Utils/senfassert.hh"
+#include <senf/Utils/TypeInfo.hh>
+#include <senf/Utils/senfassert.hh>
+#include "Module.hh"
#define prefix_ inline
-///////////////////////////////cci.p///////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
-///////////////////////////////////////////////////////////////////////////
+#ifdef SENF_PPI_NOTRACE
+# define SENF_PPI_THROTTLE_TRACE(label, type)
+# define SENF_PPI_TRACE(packet, label)
+#else
+# define SENF_PPI_THROTTLE_TRACE(label, type) throttleTrace(label, type)
+# define SENF_PPI_TRACE(packet, label) trace(packet, label)
+#endif
+
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
// senf::ppi::connector::Connector
prefix_ senf::ppi::connector::Connector & senf::ppi::connector::Connector::peer()
const
{
// The connector is not connected
- SENF_ASSERT(peer_ && "senf::ppi::connect() call missing");
+ SENF_ASSERT(peer_, "senf::ppi::connect() call missing");
return *peer_;
}
{
// The connector is not registered in the module -> probably a route() or noroute() statement is
// missing.
- SENF_ASSERT(module_ && "Connector not registered: Missing route() or noroute()");
+ SENF_ASSERT(module_, "Connector not registered: Missing route() or noroute()");
return *module_;
}
return traceState_;
}
-////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
// protected members
prefix_ senf::ppi::connector::Connector::Connector()
: peer_(), module_()
{}
-prefix_ senf::ppi::connector::Connector::~Connector()
-{
- if (connected()) {
- Connector & peer (*peer_);
- peer_->peer_ = 0;
- peer.v_init();
- }
-}
-
prefix_ bool senf::ppi::connector::Connector::connected()
const
{
return peer_;
}
-////////////////////////////////////////
-// private members
-
-prefix_ void senf::ppi::connector::Connector::setModule(module::Module & module)
-{
- module_ = &module;
-}
-
-///////////////////////////////////////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
// senf::ppi::connector::PassiveConnector
prefix_ senf::ppi::connector::ActiveConnector & senf::ppi::connector::PassiveConnector::peer()
const
{
- return dynamic_cast<ActiveConnector&>(Connector::peer());
+ SENF_ASSERT(peer_, "senf::ppi::connect() call missing");
+ return *peer_;
}
prefix_ bool senf::ppi::connector::PassiveConnector::throttled()
return nativeThrottled_ || remoteThrottled_;
}
-////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
// private members
prefix_ void senf::ppi::connector::PassiveConnector::emitThrottle()
{
- throttleTrace("OUT", "throttle");
+ SENF_PPI_THROTTLE_TRACE("OUT", "throttle");
if (connected())
peer().notifyThrottle();
}
prefix_ void senf::ppi::connector::PassiveConnector::emitUnthrottle()
{
- throttleTrace("OUT", "unthrottle");
+ SENF_PPI_THROTTLE_TRACE("OUT", "unthrottle");
if (connected()) {
peer().notifyUnthrottle();
v_unthrottleEvent();
remoteThrottled_ = true;
}
-prefix_ void senf::ppi::connector::PassiveConnector::registerRoute(ForwardingRoute & route)
-{
- routes_.push_back(&route);
-}
-
-// public members
+// public members
prefix_ bool senf::ppi::connector::PassiveConnector::nativeThrottled()
const
}
-////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
// protected members
prefix_ senf::ppi::connector::PassiveConnector::PassiveConnector()
prefix_ void senf::ppi::connector::PassiveConnector::emit()
{
// No event callback has been registered (onRequest() call missing)
- SENF_ASSERT(callback_ && "senf::ppi::connector::PassiveConnector: missing onRequest()");
- if (!throttled())
+ SENF_ASSERT(callback_, "senf::ppi::connector::PassiveConnector: missing onRequest()");
+ if (!throttled()) {
callback_();
- else
- throttleTrace("IN ", "queueing packet");
+ } else {
+ SENF_PPI_THROTTLE_TRACE("IN ", "queueing packet");
+ }
}
-///////////////////////////////////////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
// senf::ppi::connector::ActiveConnector
prefix_ senf::ppi::connector::PassiveConnector & senf::ppi::connector::ActiveConnector::peer()
const
{
- return dynamic_cast<PassiveConnector&>(Connector::peer());
+ SENF_ASSERT(peer_, "senf::ppi::connect() call missing");
+ return *peer_;
}
prefix_ void senf::ppi::connector::ActiveConnector::onThrottle()
return ! connected() || peer().throttled();
}
-////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
// protected members
prefix_ senf::ppi::connector::ActiveConnector::ActiveConnector()
: throttleCallback_(), unthrottleCallback_(), notifyRoutes_(), throttled_(false)
{}
-///////////////////////////////////////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
// senf::ppi::connector::InputConnector
prefix_ senf::Packet senf::ppi::connector::InputConnector::read()
prefix_ senf::ppi::connector::OutputConnector & senf::ppi::connector::InputConnector::peer()
const
{
- return dynamic_cast<OutputConnector &>(Connector::peer());
+ SENF_ASSERT(peer_, "senf::ppi::connect() call missing");
+ return *peer_;
}
prefix_ senf::ppi::connector::InputConnector::queue_iterator
const
{
// Cannot peek() head of empty queue
- SENF_ASSERT( ! queue_.empty() &&
+ SENF_ASSERT( ! queue_.empty(),
"senf::ppi::connector::InputConnector: cannot call peek() on empty queue" );
return queue_.back();
}
return queue_.empty();
}
-////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
// protected members
prefix_ senf::ppi::connector::InputConnector::InputConnector()
{}
-////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
// private members
prefix_ void senf::ppi::connector::InputConnector::enqueue(Packet const & p)
v_enqueueEvent();
}
-///////////////////////////////////////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
// senf::ppi::connector::OutputConnector
prefix_ senf::ppi::connector::InputConnector & senf::ppi::connector::OutputConnector::peer()
const
{
- return dynamic_cast<InputConnector&>(Connector::peer());
+ SENF_ASSERT(peer_, "senf::ppi::connect() call missing");
+ return *peer_;
}
prefix_ void senf::ppi::connector::OutputConnector::operator()(Packet const & p)
{
- trace(p, "OUT");
+ SENF_PPI_TRACE(p, "OUT");
if (connected())
peer().enqueue(p);
}
operator()(p);
}
-////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
// protected members
prefix_ senf::ppi::connector::OutputConnector::OutputConnector()
{}
-///////////////////////////////////////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
// senf::ppi::connector::GenericPassiveInput
prefix_ senf::ppi::connector::GenericPassiveInput::GenericPassiveInput()
prefix_ senf::ppi::connector::GenericActiveOutput & senf::ppi::connector::GenericPassiveInput::peer()
const
{
- return dynamic_cast<GenericActiveOutput&>(Connector::peer());
+ SENF_ASSERT(peer_, "senf::ppi::connect() call missing");
+ return *peer_;
}
prefix_ bool senf::ppi::connector::GenericPassiveInput::boolean_test()
return ! empty();
}
-///////////////////////////////////////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
// senf::ppi::connector::GenericPassiveOutput
prefix_ senf::ppi::connector::GenericActiveInput & senf::ppi::connector::GenericPassiveOutput::peer()
const
{
- return dynamic_cast<GenericActiveInput&>(Connector::peer());
+ SENF_ASSERT(peer_, "senf::ppi::connect() call missing");
+ return *peer_;
}
prefix_ bool senf::ppi::connector::GenericPassiveOutput::boolean_test()
prefix_ senf::ppi::connector::GenericPassiveOutput::GenericPassiveOutput()
{}
-///////////////////////////////////////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
// senf::ppi::connector::GenericActiveInput
prefix_ senf::ppi::connector::GenericPassiveOutput & senf::ppi::connector::GenericActiveInput::peer()
const
{
- return dynamic_cast<GenericPassiveOutput&>(Connector::peer());
+ SENF_ASSERT(peer_, "senf::ppi::connect() call missing");
+ return *peer_;
}
prefix_ bool senf::ppi::connector::GenericActiveInput::boolean_test()
prefix_ senf::ppi::connector::GenericActiveInput::GenericActiveInput()
{}
-///////////////////////////////////////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
// senf::ppi::connector::GenericActiveOutput
prefix_ senf::ppi::connector::GenericPassiveInput & senf::ppi::connector::GenericActiveOutput::peer()
const
{
- return dynamic_cast<GenericPassiveInput&>(Connector::peer());
+ SENF_ASSERT(peer_, "senf::ppi::connect() call missing");
+ return *peer_;
}
prefix_ bool senf::ppi::connector::GenericActiveOutput::boolean_test()
prefix_ senf::ppi::connector::GenericActiveOutput::GenericActiveOutput()
{}
-///////////////////////////////cci.e///////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
#undef prefix_
\f