// $Id$
//
-// Copyright (C) 2007
-// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
-// Kompetenzzentrum fuer Satelitenkommunikation (SatCom)
+// Copyright (C) 2007
+// Fraunhofer Institute for Open Communication Systems (FOKUS)
+// Competence Center NETwork research (NET), St. Augustin, GERMANY
// Stefan Bund <g0dil@berlios.de>
//
// This program is free software; you can redistribute it and/or modify
\brief Connectors inline non-template implementation */
// Custom includes
+#include "../Utils/TypeInfo.hh"
+#include "../Utils/senfassert.hh"
#define prefix_ inline
///////////////////////////////cci.p///////////////////////////////////////
prefix_ senf::ppi::connector::Connector & senf::ppi::connector::Connector::peer()
const
{
- BOOST_ASSERT(peer_);
+ // The connector is not connected
+ SENF_ASSERT(peer_);
return *peer_;
}
prefix_ senf::ppi::module::Module & senf::ppi::connector::Connector::module()
const
{
- BOOST_ASSERT(module_);
+ // 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 (connected()) {
+ Connector & peer (*peer_);
+ peer_->peer_ = 0;
+ peer.v_init();
+ }
+}
-prefix_ void senf::ppi::connector::Connector::connect(Connector & target)
+prefix_ bool senf::ppi::connector::Connector::connected()
+ const
{
- peer_ = & target;
- target.peer_ = this;
+ return peer_;
}
////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
// senf::ppi::connector::PassiveConnector
+prefix_ senf::ppi::connector::ActiveConnector & senf::ppi::connector::PassiveConnector::peer()
+ const
+{
+ return dynamic_cast<ActiveConnector&>(Connector::peer());
+}
+
prefix_ bool senf::ppi::connector::PassiveConnector::throttled()
const
{
return nativeThrottled_ || remoteThrottled_;
}
+////////////////////////////////////////
+// private members
+
+prefix_ void senf::ppi::connector::PassiveConnector::emitThrottle()
+{
+ if (connected())
+ peer().notifyThrottle();
+}
+
+prefix_ void senf::ppi::connector::PassiveConnector::emitUnthrottle()
+{
+ if (connected()) {
+ peer().notifyUnthrottle();
+ v_unthrottleEvent();
+ }
+}
+
+prefix_ void senf::ppi::connector::PassiveConnector::notifyThrottle()
+{
+ if (!throttled()) {
+ remoteThrottled_ = true;
+ emitThrottle();
+ }
+ else
+ remoteThrottled_ = true;
+}
+
+prefix_ void senf::ppi::connector::PassiveConnector::registerRoute(ForwardingRoute & route)
+{
+ routes_.push_back(&route);
+}
+
+// public members
+
prefix_ bool senf::ppi::connector::PassiveConnector::nativeThrottled()
const
{
prefix_ void senf::ppi::connector::PassiveConnector::throttle()
{
- if (!throttled())
+ if (!throttled()) {
+ nativeThrottled_ = true;
emitThrottle();
- nativeThrottled_ = true;
+ }
}
prefix_ void senf::ppi::connector::PassiveConnector::unthrottle()
}
-prefix_ senf::ppi::connector::ActiveConnector & senf::ppi::connector::PassiveConnector::peer()
- const
-{
- return dynamic_cast<ActiveConnector&>(Connector::peer());
-}
-
////////////////////////////////////////
// protected members
prefix_ void senf::ppi::connector::PassiveConnector::emit()
{
- BOOST_ASSERT(callback_);
+ // No event callback has been registered (onEvent() call missing)
+ SENF_ASSERT(callback_);
if (!throttled())
callback_();
}
-////////////////////////////////////////
-// private members
-
-prefix_ void senf::ppi::connector::PassiveConnector::notifyThrottle()
-{
- if (!throttled()) {
- remoteThrottled_ = true;
- emitThrottle();
- }
- else
- remoteThrottled_ = true;
-}
-
-prefix_ void senf::ppi::connector::PassiveConnector::notifyUnthrottle()
-{
- if (throttled() && !nativeThrottled_) {
- remoteThrottled_ = false;
- emitUnthrottle();
- }
- else
- remoteThrottled_ = false;
-}
-
-prefix_ void senf::ppi::connector::PassiveConnector::emitThrottle()
-{
- peer().notifyThrottle();
-}
-
-prefix_ void senf::ppi::connector::PassiveConnector::emitUnthrottle()
-{
- peer().notifyUnthrottle();
- v_unthrottleEvent();
-}
-
-prefix_ void senf::ppi::connector::PassiveConnector::v_unthrottleEvent()
-{}
-
///////////////////////////////////////////////////////////////////////////
// senf::ppi::connector::ActiveConnector
unthrottleCallback_ = Callback();
}
+prefix_ bool senf::ppi::connector::ActiveConnector::throttled()
+ const
+{
+ return ! connected() || peer().throttled();
+}
+
////////////////////////////////////////
// protected members
prefix_ senf::ppi::connector::ActiveConnector::ActiveConnector()
- : throttleCallback_(), unthrottleCallback_(), notifyRoutes_()
+ : throttleCallback_(), unthrottleCallback_(), notifyRoutes_(), throttled_(false)
{}
///////////////////////////////////////////////////////////////////////////
// senf::ppi::connector::InputConnector
+prefix_ senf::Packet senf::ppi::connector::InputConnector::read()
+{
+ return operator()();
+}
+
prefix_ senf::ppi::connector::OutputConnector & senf::ppi::connector::InputConnector::peer()
const
{
prefix_ senf::Packet senf::ppi::connector::InputConnector::peek()
const
{
- BOOST_ASSERT( ! queue_.empty() );
+ // 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();
///////////////////////////////////////////////////////////////////////////
// senf::ppi::connector::OutputConnector
-prefix_ void senf::ppi::connector::OutputConnector::operator()(Packet p)
-{
- peer().enqueue(p);
-}
-
prefix_ senf::ppi::connector::InputConnector & senf::ppi::connector::OutputConnector::peer()
const
{
return dynamic_cast<InputConnector&>(Connector::peer());
}
+prefix_ void senf::ppi::connector::OutputConnector::operator()(Packet const & p)
+{
+ if (connected())
+ peer().enqueue(p);
+}
+
+prefix_ void senf::ppi::connector::OutputConnector::write(Packet const & p)
+{
+ operator()(p);
+}
+
////////////////////////////////////////
// protected members
{}
///////////////////////////////////////////////////////////////////////////
-// senf::ppi::connector::PassiveInput
+// senf::ppi::connector::GenericPassiveInput
-prefix_ senf::ppi::connector::PassiveInput::PassiveInput()
+prefix_ senf::ppi::connector::GenericPassiveInput::GenericPassiveInput()
: qdisc_(new ThresholdQueueing(1,0))
{}
-prefix_ senf::ppi::connector::ActiveOutput & senf::ppi::connector::PassiveInput::peer()
+prefix_ senf::ppi::connector::GenericActiveOutput & senf::ppi::connector::GenericPassiveInput::peer()
const
{
- return dynamic_cast<ActiveOutput&>(Connector::peer());
+ return dynamic_cast<GenericActiveOutput&>(Connector::peer());
}
-prefix_ bool senf::ppi::connector::PassiveInput::boolean_test()
+prefix_ bool senf::ppi::connector::GenericPassiveInput::boolean_test()
const
{
return ! empty();
}
///////////////////////////////////////////////////////////////////////////
-// senf::ppi::connector::PassiveOutput
+// senf::ppi::connector::GenericPassiveOutput
-prefix_ senf::ppi::connector::ActiveInput & senf::ppi::connector::PassiveOutput::peer()
+prefix_ senf::ppi::connector::GenericActiveInput & senf::ppi::connector::GenericPassiveOutput::peer()
const
{
- return dynamic_cast<ActiveInput&>(Connector::peer());
+ return dynamic_cast<GenericActiveInput&>(Connector::peer());
}
-prefix_ bool senf::ppi::connector::PassiveOutput::boolean_test()
+prefix_ bool senf::ppi::connector::GenericPassiveOutput::boolean_test()
const
{
return true;
}
-prefix_ void senf::ppi::connector::PassiveOutput::connect(ActiveInput & target)
+prefix_ void senf::ppi::connector::GenericPassiveOutput::connect(GenericActiveInput & target)
{
Connector::connect(target);
}
+prefix_ senf::ppi::connector::GenericPassiveOutput::GenericPassiveOutput()
+{}
+
///////////////////////////////////////////////////////////////////////////
-// senf::ppi::connector::ActiveInput
+// senf::ppi::connector::GenericActiveInput
-prefix_ senf::ppi::connector::PassiveOutput & senf::ppi::connector::ActiveInput::peer()
+prefix_ senf::ppi::connector::GenericPassiveOutput & senf::ppi::connector::GenericActiveInput::peer()
const
{
- return dynamic_cast<PassiveOutput&>(Connector::peer());
+ return dynamic_cast<GenericPassiveOutput&>(Connector::peer());
}
-prefix_ bool senf::ppi::connector::ActiveInput::boolean_test()
+prefix_ bool senf::ppi::connector::GenericActiveInput::boolean_test()
const
{
- return ! empty() || ! peer().throttled();
+ return ! empty() || (connected() && ! peer().throttled());
}
-prefix_ void senf::ppi::connector::ActiveInput::request()
+prefix_ void senf::ppi::connector::GenericActiveInput::request()
{
- peer().emit();
+ if (connected())
+ peer().emit();
}
+prefix_ senf::ppi::connector::GenericActiveInput::GenericActiveInput()
+{}
+
///////////////////////////////////////////////////////////////////////////
-// senf::ppi::connector::ActiveOutput
+// senf::ppi::connector::GenericActiveOutput
-prefix_ senf::ppi::connector::PassiveInput & senf::ppi::connector::ActiveOutput::peer()
+prefix_ senf::ppi::connector::GenericPassiveInput & senf::ppi::connector::GenericActiveOutput::peer()
const
{
- return dynamic_cast<PassiveInput&>(Connector::peer());
+ return dynamic_cast<GenericPassiveInput&>(Connector::peer());
}
-prefix_ bool senf::ppi::connector::ActiveOutput::boolean_test()
+prefix_ bool senf::ppi::connector::GenericActiveOutput::boolean_test()
const
{
- return ! peer().throttled();
+ return connected() && ! peer().throttled();
}
-prefix_ void senf::ppi::connector::ActiveOutput::connect(PassiveInput & target)
+prefix_ void senf::ppi::connector::GenericActiveOutput::connect(GenericPassiveInput & target)
{
Connector::connect(target);
}
+prefix_ senf::ppi::connector::GenericActiveOutput::GenericActiveOutput()
+{}
+
///////////////////////////////cci.e///////////////////////////////////////
#undef prefix_