X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=senf%2FPPI%2FConnectors.cci;h=957f15c4cef4cea8f70116fbe3ecaadc67eef7a2;hb=69c137120ce26b83cf37b125c5c54e1eb61f39a3;hp=10d3399947b3e044680359275f5642001d02591e;hpb=a9c9fa201ef6a90e40a7acc690e8c0c12a901736;p=senf.git diff --git a/senf/PPI/Connectors.cci b/senf/PPI/Connectors.cci index 10d3399..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 */ @@ -29,7 +34,7 @@ #include "Module.hh" #define prefix_ inline -///////////////////////////////cci.p/////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// #ifdef SENF_PPI_NOTRACE # define SENF_PPI_THROTTLE_TRACE(label, type) @@ -39,7 +44,7 @@ # define SENF_PPI_TRACE(packet, label) trace(packet, label) #endif -/////////////////////////////////////////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// // senf::ppi::connector::Connector prefix_ senf::ppi::connector::Connector & senf::ppi::connector::Connector::peer() @@ -69,7 +74,7 @@ prefix_ senf::ppi::connector::Connector::TraceState senf::ppi::connector::Connec return traceState_; } -//////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// // protected members prefix_ senf::ppi::connector::Connector::Connector() @@ -82,27 +87,14 @@ prefix_ bool senf::ppi::connector::Connector::connected() return peer_; } -prefix_ void senf::ppi::connector::Connector::unregisterConnector() -{ - if (module_) - module_->unregisterConnector(*this); -} - -//////////////////////////////////////// -// 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() @@ -111,7 +103,7 @@ prefix_ bool senf::ppi::connector::PassiveConnector::throttled() return nativeThrottled_ || remoteThrottled_; } -//////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// // private members prefix_ void senf::ppi::connector::PassiveConnector::emitThrottle() @@ -167,7 +159,7 @@ prefix_ void senf::ppi::connector::PassiveConnector::unthrottle() } -//////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// // protected members prefix_ senf::ppi::connector::PassiveConnector::PassiveConnector() @@ -185,13 +177,14 @@ prefix_ void senf::ppi::connector::PassiveConnector::emit() } } -/////////////////////////////////////////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// // 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,67 +221,61 @@ 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) @@ -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_