// $Id$
//
-// Copyright (C) 2007
-// Fraunhofer Institute for Open Communication Systems (FOKUS)
-// Competence Center NETwork research (NET), St. Augustin, GERMANY
+// 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
namespace connector {
/** \namespace senf::ppi::connector
- \brief Connector classes
+ \brief Connector classes
A connector has two independent properties
- \li it may be \e active or \e passive
- \li it may be an \e input or an \e output
-
+ - it may be \e active or \e passive
+ - it may be an \e input or an \e output
+
\e Active connectors are activated from within the module, \e passive connectors are
signaled by the external framework. \e Input modules receive packets, \e output modules send
packets.
All passive connectors call some onRequest callback whenever I/O needs to be performed. All
input modules possess a packet queue.
- We therefore have 4 connector types:
- \li senf::ppi::connector::ActiveInput
- \li senf::ppi::connector::ActiveOutput
- \li senf::ppi::connector::PassiveInput
- \li senf::ppi::connector::PassiveOutput.
+ We therefore have 4 connector types:
+ - senf::ppi::connector::ActiveInput
+ - senf::ppi::connector::ActiveOutput
+ - senf::ppi::connector::PassiveInput
+ - senf::ppi::connector::PassiveOutput.
Connectors are declared as module data members and are then externally connected to other
modules.
};
\endcode
- \see
+ \see
senf::ppi::module::Module \n
senf::ppi::connect() \n
\ref ppi_connectors
of connector (output or input) the respective throttling is called forward or backward
throttling.
- Passive connectors always handle two throttling states:
-
- \li The \e native throttling state is set manually by the module. It is the throttling state
+ Passive connectors always handle two throttling states:
+
+ - The \e native throttling state is set manually by the module. It is the throttling state
originating in the current module
- \li The \e forwarded throttling state is the state as it is received by throttling
+ - The \e forwarded throttling state is the state as it is received by throttling
notifications
The accumulative throttling state is generated by combining all sub-states.
*/
- class PassiveConnector
+ class PassiveConnector
: public virtual Connector
{
public:
is a pointer-to-member to a member of the class which
holds this input. In the second case, the pointer will
automatically be bound to the containing instance.
-
+
\param[in] handler Handler to call, whenever an I/O
operation is to be performed. */
-
+
bool throttled() const; ///< Get accumulative throttling state
bool nativeThrottled() const; ///< Get native throttling state
void throttle(); ///< Set native throttling
void unthrottle(); ///< Revoke native throttling
-
+
ActiveConnector & peer() const;
protected:
notifications. These notifications should then either be processed by the module or be
forwarded to other connectors.
*/
- class ActiveConnector
+ class ActiveConnector
: public virtual Connector
{
typedef ppi::detail::Callback<>::type Callback;
insertion/deletion but I believe that list is just to expensive since every packet will
be added to the queue before it can be processed.
*/
- class InputConnector
+ class InputConnector
: public virtual Connector
{
typedef std::deque<Packet> Queue;
protected:
InputConnector();
-
+
private:
void enqueue(Packet p);
-
+
virtual void v_requestEvent();
virtual void v_enqueueEvent();
virtual void v_dequeueEvent();
friend class OutputConnector;
};
-
+
/** \brief Output connector base-class
-
+
An output connector sends out packets. It may be either an ActiveConnector or a
PassiveConnector. An output connector does \e not have an built-in queueing, it relies on
the queueing of the connected input.
*/
- class OutputConnector
+ class OutputConnector
: public virtual Connector
{
public:
protected:
OutputConnector();
};
-
+
/** \brief Combination of PassiveConnector and InputConnector
The GenericPassiveInput automatically controls the connectors throttling state using a
<tt>ThresholdQueueing(1,0)</tt> which will throttle the input whenever the queue is
non-empty.
*/
- class GenericPassiveInput
+ class GenericPassiveInput
: public PassiveConnector, public InputConnector,
public safe_bool<GenericPassiveInput>
{
void qdisc(QDisc const & disc); ///< Change the queueing discipline
/**< The queueing discipline is a class which provides the
QueueingDiscipline interface.
-
+
\param[in] disc New queueing discipline */
protected:
public: \
using mixin::operator(); \
using mixin::TypedConnector_ ## dir ; \
+ private: \
+ friend class detail::Typed ## dir ## Mixin<type ## dir <PacketType>, PacketType>; \
}; \
template <> \
class type ## dir <Packet> : public Generic ## type ## dir \
that read packets are returned as \a PacketType instead of generic senf::Packet references.
\see GenericActiveInput \n
- senf::ppi::connectro
+ senf::ppi::connector
*/
- template <class PacketType>
+ template <class PacketType=Packet>
class ActiveInput : public GenericActiveInput
{
public:
\see GenericActiveOutput \n
senf::ppi::connector
*/
- template <class PacketType>
+ template <class PacketType=Packet>
class ActiveOutput : public GenericActiveOutput
{
public:
- PacketType operator()();
- PacketType write();
+ operator()(PacketType packet); ///< Send out a packet
+ write(PacketType packet); ///< Alias for operator()
};
/** \brief Connector passively providing packets
\see GenericPassiveOutput \n
senf::ppi::connector
*/
- template <class PacketType>
+ template <class PacketType=Packet>
class PassiveOutput : public GenericPassiveOutput
{
public:
- PacketType operator()();
- PacketType write();
+ operator()(PacketType packet); ///< Send out a packet
+ write(PacketType packet); ///< Alias for operator()
};
#endif