X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=senf%2FPPI%2FConnectors.cci;h=957f15c4cef4cea8f70116fbe3ecaadc67eef7a2;hb=69c137120ce26b83cf37b125c5c54e1eb61f39a3;hp=2abd3b1214811be906d451ed9682b19a73902a03;hpb=45b346fa3a120720280b67b0f405b1954c0885d4;p=senf.git diff --git a/senf/PPI/Connectors.cci b/senf/PPI/Connectors.cci index 2abd3b1..957f15c 100644 --- a/senf/PPI/Connectors.cci +++ b/senf/PPI/Connectors.cci @@ -2,23 +2,28 @@ // // Copyright (C) 2007 // Fraunhofer Institute for Open Communication Systems (FOKUS) -// Competence Center NETwork research (NET), St. Augustin, GERMANY -// Stefan Bund // -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. +// The contents of this file are subject to the Fraunhofer FOKUS Public License +// Version 1.0 (the "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// http://senf.berlios.de/license.html // -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. +// The Fraunhofer FOKUS Public License Version 1.0 is based on, +// but modifies the Mozilla Public License Version 1.1. +// See the full license text for the amendments. // -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the -// Free Software Foundation, Inc., -// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// Software distributed under the License is distributed on an "AS IS" basis, +// WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +// for the specific language governing rights and limitations under the License. +// +// The Original Code is Fraunhofer FOKUS code. +// +// The Initial Developer of the Original Code is Fraunhofer-Gesellschaft e.V. +// (registered association), Hansastraße 27 c, 80686 Munich, Germany. +// All Rights Reserved. +// +// Contributor(s): +// Stefan Bund /** \file \brief Connectors inline non-template implementation */ @@ -26,18 +31,27 @@ // Custom includes #include #include +#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_; } @@ -46,7 +60,7 @@ prefix_ senf::ppi::module::Module & senf::ppi::connector::Connector::module() { // 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_; } @@ -60,45 +74,27 @@ prefix_ senf::ppi::connector::Connector::TraceState senf::ppi::connector::Connec 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; - if (! peer.initializationScheduled()) - peer.enqueueInitializable(); - peer.v_disconnected(); - } -} - 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(Connector::peer()); + SENF_ASSERT(peer_, "senf::ppi::connect() call missing"); + return *peer_; } prefix_ bool senf::ppi::connector::PassiveConnector::throttled() @@ -107,19 +103,19 @@ 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(); @@ -136,12 +132,7 @@ prefix_ void senf::ppi::connector::PassiveConnector::notifyThrottle() 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 @@ -168,7 +159,7 @@ prefix_ void senf::ppi::connector::PassiveConnector::unthrottle() } -//////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// // protected members prefix_ senf::ppi::connector::PassiveConnector::PassiveConnector() @@ -178,20 +169,22 @@ 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(Connector::peer()); + SENF_ASSERT(peer_, "senf::ppi::connect() call missing"); + return *peer_; } prefix_ void senf::ppi::connector::ActiveConnector::onThrottle() @@ -210,17 +203,17 @@ prefix_ bool senf::ppi::connector::ActiveConnector::throttled() 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::Packet const & senf::ppi::connector::InputConnector::read() { return operator()(); } @@ -228,72 +221,66 @@ prefix_ senf::Packet senf::ppi::connector::InputConnector::read() prefix_ senf::ppi::connector::OutputConnector & senf::ppi::connector::InputConnector::peer() const { - return dynamic_cast(Connector::peer()); -} - -prefix_ senf::ppi::connector::InputConnector::queue_iterator -senf::ppi::connector::InputConnector::begin() - const -{ - return queue_.begin(); -} - -prefix_ senf::ppi::connector::InputConnector::queue_iterator -senf::ppi::connector::InputConnector::end() - const -{ - return queue_.end(); -} - -prefix_ senf::Packet senf::ppi::connector::InputConnector::peek() - const -{ - // Cannot peek() head of empty queue - SENF_ASSERT( ! queue_.empty() && - "senf::ppi::connector::InputConnector: cannot call peek() on empty queue" ); - return queue_.back(); + SENF_ASSERT(peer_, "senf::ppi::connect() call missing"); + return *peer_; } prefix_ senf::ppi::connector::InputConnector::size_type senf::ppi::connector::InputConnector::queueSize() const { - return queue_.size(); + return queue_.size() + (fastPacket_ ? 1 : 0); } prefix_ bool senf::ppi::connector::InputConnector::empty() const { - return queue_.empty(); + return fastPacket_ == NULL && queue_.empty(); } -//////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// // protected members prefix_ senf::ppi::connector::InputConnector::InputConnector() + : fastPacket_(NULL) {} -//////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// // private members prefix_ void senf::ppi::connector::InputConnector::enqueue(Packet const & p) { - queue_.push_front(p); - v_enqueueEvent(); + if (queue_.empty()) { + fastPacket_ = &p; + try { + v_enqueueEvent(); + } catch (Exception & e) { + queue_.push_front(p); + throw e; + } + if (fastPacket_) { + queue_.push_front(p); + fastPacket_ = NULL; + } + } else { + queue_.push_front(p); + v_enqueueEvent(); + } } -/////////////////////////////////////////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// // senf::ppi::connector::OutputConnector prefix_ senf::ppi::connector::InputConnector & senf::ppi::connector::OutputConnector::peer() const { - return dynamic_cast(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); } @@ -303,13 +290,13 @@ prefix_ void senf::ppi::connector::OutputConnector::write(Packet const & p) operator()(p); } -//////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// // protected members prefix_ senf::ppi::connector::OutputConnector::OutputConnector() {} -/////////////////////////////////////////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// // senf::ppi::connector::GenericPassiveInput prefix_ senf::ppi::connector::GenericPassiveInput::GenericPassiveInput() @@ -319,7 +306,8 @@ prefix_ senf::ppi::connector::GenericPassiveInput::GenericPassiveInput() prefix_ senf::ppi::connector::GenericActiveOutput & senf::ppi::connector::GenericPassiveInput::peer() const { - return dynamic_cast(Connector::peer()); + SENF_ASSERT(peer_, "senf::ppi::connect() call missing"); + return *peer_; } prefix_ bool senf::ppi::connector::GenericPassiveInput::boolean_test() @@ -328,13 +316,14 @@ 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(Connector::peer()); + SENF_ASSERT(peer_, "senf::ppi::connect() call missing"); + return *peer_; } prefix_ bool senf::ppi::connector::GenericPassiveOutput::boolean_test() @@ -351,13 +340,14 @@ prefix_ void senf::ppi::connector::GenericPassiveOutput::connect(GenericActiveIn prefix_ senf::ppi::connector::GenericPassiveOutput::GenericPassiveOutput() {} -/////////////////////////////////////////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// // senf::ppi::connector::GenericActiveInput prefix_ senf::ppi::connector::GenericPassiveOutput & senf::ppi::connector::GenericActiveInput::peer() const { - return dynamic_cast(Connector::peer()); + SENF_ASSERT(peer_, "senf::ppi::connect() call missing"); + return *peer_; } prefix_ bool senf::ppi::connector::GenericActiveInput::boolean_test() @@ -375,13 +365,14 @@ prefix_ void senf::ppi::connector::GenericActiveInput::request() prefix_ senf::ppi::connector::GenericActiveInput::GenericActiveInput() {} -/////////////////////////////////////////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// // senf::ppi::connector::GenericActiveOutput prefix_ senf::ppi::connector::GenericPassiveInput & senf::ppi::connector::GenericActiveOutput::peer() const { - return dynamic_cast(Connector::peer()); + SENF_ASSERT(peer_, "senf::ppi::connect() call missing"); + return *peer_; } prefix_ bool senf::ppi::connector::GenericActiveOutput::boolean_test() @@ -398,7 +389,7 @@ prefix_ void senf::ppi::connector::GenericActiveOutput::connect(GenericPassiveIn prefix_ senf::ppi::connector::GenericActiveOutput::GenericActiveOutput() {} -///////////////////////////////cci.e/////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// #undef prefix_