diff --git a/PPI/IOEvent.hh b/PPI/IOEvent.hh index 730b66bcf0bc33e9a7691a2afd82c676b87f9392..b6bb619f8144a2f55a45fae4fb7268dca093d7f9 100644 --- a/PPI/IOEvent.hh +++ b/PPI/IOEvent.hh @@ -123,7 +123,7 @@ namespace ppi { }} ///////////////////////////////hh.e//////////////////////////////////////// -//#include "IOEvent.cci" +#include "IOEvent.cci" //#include "IOEvent.ct" #include "IOEvent.cti" #endif diff --git a/PPI/SocketSink.ct b/PPI/SocketSink.ct index e578fd07ae614fa5fee0714d05f03cc58d7d6e7d..69726a28d44250d6ca8c8c179cada27127fbb4f0 100644 --- a/PPI/SocketSink.ct +++ b/PPI/SocketSink.ct @@ -33,6 +33,21 @@ /////////////////////////////////////////////////////////////////////////// // senf::ppi::module::ActiveSocketSink<Writer> +template <class Writer> +prefix_ senf::ppi::module::ActiveSocketSink<Writer>::ActiveSocketSink() +{ + registerEvent( event_, &ActiveSocketSink::write ); + route(input, event_); +} + +template <class Writer> +prefix_ senf::ppi::module::ActiveSocketSink<Writer>::ActiveSocketSink(Writer const & writer) + : writer_ (writer) +{ + registerEvent( event_, &ActiveSocketSink::write ); + route(input, event_); +} + template <class Writer> prefix_ senf::ppi::module::ActiveSocketSink<Writer>::ActiveSocketSink(Handle handle) : handle_(handle), event_(handle_, IOEvent::Write), writer_() @@ -62,12 +77,30 @@ prefix_ void senf::ppi::module::ActiveSocketSink<Writer>::write() /////////////////////////////////////////////////////////////////////////// // senf::ppi::module::PassiveSocketSink<Writer> +template <class Writer> +prefix_ senf::ppi::module::PassiveSocketSink<Writer>::PassiveSocketSink() +{ + noroute(input); + input.onRequest(&PassiveSocketSink::write); + checkThrottle(); +} + +template <class Writer> +prefix_ senf::ppi::module::PassiveSocketSink<Writer>::PassiveSocketSink(Writer const & writer) + : writer_ (writer) +{ + noroute(input); + input.onRequest(&PassiveSocketSink::write); + checkThrottle(); +} + template <class Writer> prefix_ senf::ppi::module::PassiveSocketSink<Writer>::PassiveSocketSink(Handle handle) : handle_(handle), writer_() { noroute(input); input.onRequest(&PassiveSocketSink::write); + checkThrottle(); } template <class Writer> @@ -77,6 +110,7 @@ prefix_ senf::ppi::module::PassiveSocketSink<Writer>::PassiveSocketSink(Handle h { noroute(input); input.onRequest(&PassiveSocketSink::write); + checkThrottle(); } //////////////////////////////////////// @@ -88,6 +122,15 @@ prefix_ void senf::ppi::module::PassiveSocketSink<Writer>::write() writer_(handle_,input()); } +template <class Writer> +prefix_ void senf::ppi::module::PassiveSocketSink<Writer>::checkThrottle() +{ + if (handle_) + input.unthrottle(); + else + input.throttle(); +} + ///////////////////////////////ct.e//////////////////////////////////////// #undef prefix_ diff --git a/PPI/SocketSink.cti b/PPI/SocketSink.cti index 1ae129be8e5ba9837b59d16a6109b67e159b3678..b7482eb13f55e528213344e6f3c95fdf6dea8e76 100644 --- a/PPI/SocketSink.cti +++ b/PPI/SocketSink.cti @@ -39,6 +39,20 @@ prefix_ Writer & senf::ppi::module::ActiveSocketSink<Writer>::writer() return writer_; } +template <class Writer> +prefix_ typename senf::ppi::module::ActiveSocketSink<Writer>::Handle +senf::ppi::module::ActiveSocketSink<Writer>::handle() +{ + return handle_; +} + +template <class Writer> +prefix_ void senf::ppi::module::ActiveSocketSink<Writer>::handle(Handle handle) +{ + handle_ = handle; + event_.set(handle_, IOEvent::Write); +} + /////////////////////////////////////////////////////////////////////////// // senf::ppi::module::PassiveSocketSink<Writer> @@ -55,10 +69,20 @@ prefix_ typename Writer::Handle & senf::ppi::module::PassiveSocketSink<Writer>:: } template <class Writer> -prefix_ void senf::ppi::module::PassiveSocketSink<Writer>::replaceHandle(Handle handle) +prefix_ void senf::ppi::module::PassiveSocketSink<Writer>::handle(Handle handle) { handle_ = handle; + checkThrottle(); } + +#ifndef DOXYGEN +template <class Writer> +prefix_ void senf::ppi::module::PassiveSocketSink<Writer>::replaceHandle(Handle newHandle) +{ + handle(newHandle); +} +#endif + ///////////////////////////////cti.e/////////////////////////////////////// #undef prefix_ diff --git a/PPI/SocketSink.hh b/PPI/SocketSink.hh index 742e2dbbd9507b249aff4a1b5e1f536331f6a5ae..83a1d5f196ae914759baefa806cc78222c002207 100644 --- a/PPI/SocketSink.hh +++ b/PPI/SocketSink.hh @@ -166,7 +166,16 @@ namespace module { connector::ActiveInput<> input; ///< Input connector from which data is received - ActiveSocketSink(Handle handle); ///< Create new writer for the given handle + ActiveSocketSink(); ///< Create non-connected writer + /**< The writer will be disabled until a socket is set + \pre Requires \a Writer to be default constructible */ + explicit ActiveSocketSink(Writer const & writer); + ///< Create non-connected writer + /**< The writer will be disabled until a socket is set + \pre Requires \a Writer to be copy constructible + \param[in] writer Writer helper writing packet date to + the socket */ + explicit ActiveSocketSink(Handle handle); ///< Create new writer for the given handle /**< Data will be written to \a handle using \a Writer. \pre Requires \a Writer to be default constructible \param[in] handle Handle to write data to */ @@ -175,10 +184,15 @@ namespace module { /**< Data will be written to \a handle using \a Writer. \pre Requires \a Writer to be copy constructible \param[in] handle Handle to write data to - \param[in] writer Writer helper writing packet date to the - socket */ + \param[in] writer Writer helper writing packet date to + the socket */ + + Writer & writer(); ///< Access the Writer + Handle handle(); ///< Access handle + void handle(Handle handle); ///< Set handle + /**< Assigning an empty or in-valid() handle will disable + the module until a new. valid handle is assigned. */ - Writer & writer(); ///< Access the Writer private: void write(); @@ -227,7 +241,16 @@ namespace module { connector::PassiveInput<> input; ///< Input connector from which data is received - PassiveSocketSink(Handle handle); ///< Create new writer for the given handle + PassiveSocketSink(); ///< Create non-connected writer + /**< The writer will be disabled until a socket is set + \pre Requires \a Writer to be default constructible */ + explicit PassiveSocketSink(Writer const & writer); + ///< Create non-connected writer + /**< The writer will be disabled until a socket is set + \pre Requires \a Writer to be copy constructible + \param[in] writer Writer helper writing packet date to + the socket */ + explicit PassiveSocketSink(Handle handle); ///< Create new writer for the given handle /**< Data will be written to \a handle using \a Writer. \pre Requires \a Writer to be default constructible \param[in] handle Handle to write data to */ @@ -235,22 +258,23 @@ namespace module { ///< Create new writer for the given handle /**< Data will be written to \a handle using \a Writer. \pre Requires \a Writer to be copy constructible - \param[in] handle Handle to write data to */ + \param[in] handle Handle to write data to + \param[in] writer Writer helper writing packet date to + the socket */ + + Writer & writer(); ///< Access the Writer + Handle & handle(); ///< Access handle + void handle(Handle handle); ///< Set handle + /**< Assigning an empty or in-valid() handle will disable + the module until a new. valid handle is assigned. */ - Writer & writer(); ///< Access the Writer - Handle & handle(); /**< Access the handle. This is intendet to be mainly used to reconnect - the underlying socket. */ - /* void reconnect(senf::SocketAddress newAddress); - ///< Reconnect the handle to which the packets are written - */ +#ifndef DOXYGEN void replaceHandle(Handle newHandle); - /**< Replace the handle to which the packets are written - * Normally you should access the handle and call connect with - * the new address. This also works for other - * (active) ConnectedSocketSinks/Sources */ +#endif private: void write(); + void checkThrottle(); Handle handle_; Writer writer_;