Search:

SENF Extensible Network Framework

  • Home
  • Download
  • Wiki
  • BerliOS
  • ChangeLog
  • Browse SVN
  • Bug Tracker
  • Overview
  • Examples
  • HowTos
  • Glossary
  • PPI
  • Packets
  • Scheduler
  • Socket
  • Utils
  • Console
  • Daemon
  • Logger
  • Termlib
  • Main Page
  • Related Pages
  • Modules
  • Namespaces
  • Classes
  • Files
  • Directories
  • File List
  • File Members

Connectors.cci

Go to the documentation of this file.
00001 // $Id: Connectors.cci 1742 2010-11-04 14:51:56Z g0dil $
00002 //
00003 // Copyright (C) 2007
00004 // Fraunhofer (FOKUS)
00005 // Competence Center NETwork research (NET), St. Augustin, GERMANY
00006 //     Stefan Bund <g0dil@berlios.de>
00007 //
00008 // This program is free software; you can redistribute it and/or modify
00009 // it under the terms of the GNU General Public License as published by
00010 // the Free Software Foundation; either version 2 of the License, or
00011 // (at your option) any later version.
00012 //
00013 // This program is distributed in the hope that it will be useful,
00014 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00015 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00016 // GNU General Public License for more details.
00017 //
00018 // You should have received a copy of the GNU General Public License
00019 // along with this program; if not, write to the
00020 // Free Software Foundation, Inc.,
00021 // 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
00022 
00026 // Custom includes
00027 #include <senf/Utils/TypeInfo.hh>
00028 #include <senf/Utils/senfassert.hh>
00029 #include "Module.hh"
00030 
00031 #define prefix_ inline
00032 //-/////////////////////////////////////////////////////////////////////////////////////////////////
00033 
00034 #ifdef SENF_PPI_NOTRACE
00035 #   define SENF_PPI_THROTTLE_TRACE(label, type)
00036 #   define SENF_PPI_TRACE(packet, label)
00037 #else
00038 #   define SENF_PPI_THROTTLE_TRACE(label, type) throttleTrace(label, type)
00039 #   define SENF_PPI_TRACE(packet, label) trace(packet, label)
00040 #endif
00041 
00042 //-/////////////////////////////////////////////////////////////////////////////////////////////////
00043 // senf::ppi::connector::Connector
00044 
00045 prefix_ senf::ppi::connector::Connector & senf::ppi::connector::Connector::peer()
00046     const
00047 {
00048     // The connector is not connected
00049     SENF_ASSERT(peer_, "senf::ppi::connect() call missing");
00050     return *peer_;
00051 }
00052 
00053 prefix_ senf::ppi::module::Module & senf::ppi::connector::Connector::module()
00054     const
00055 {
00056     // The connector is not registered in the module -> probably a route() or noroute() statement is
00057     // missing.
00058     SENF_ASSERT(module_, "Connector not registered: Missing route() or noroute()");
00059     return *module_;
00060 }
00061 
00062 prefix_ void senf::ppi::connector::Connector::tracing(TraceState state)
00063 {
00064     traceState_ = state;
00065 }
00066 
00067 prefix_ senf::ppi::connector::Connector::TraceState senf::ppi::connector::Connector::tracing()
00068 {
00069     return traceState_;
00070 }
00071 
00072 //-/////////////////////////////////////////////////////////////////////////////////////////////////
00073 // protected members
00074 
00075 prefix_ senf::ppi::connector::Connector::Connector()
00076     : peer_(), module_()
00077 {}
00078 
00079 prefix_ bool senf::ppi::connector::Connector::connected()
00080     const
00081 {
00082     return peer_;
00083 }
00084 
00085 //-/////////////////////////////////////////////////////////////////////////////////////////////////
00086 // senf::ppi::connector::PassiveConnector
00087 
00088 prefix_ senf::ppi::connector::ActiveConnector & senf::ppi::connector::PassiveConnector::peer()
00089     const
00090 {
00091     SENF_ASSERT(peer_, "senf::ppi::connect() call missing");
00092     return *peer_;
00093 }
00094 
00095 prefix_ bool senf::ppi::connector::PassiveConnector::throttled()
00096     const
00097 {
00098     return nativeThrottled_ || remoteThrottled_;
00099 }
00100 
00101 //-/////////////////////////////////////////////////////////////////////////////////////////////////
00102 // private members
00103 
00104 prefix_ void senf::ppi::connector::PassiveConnector::emitThrottle()
00105 {
00106     SENF_PPI_THROTTLE_TRACE("OUT", "throttle");
00107     if (connected())
00108         peer().notifyThrottle();
00109 }
00110 
00111 prefix_ void senf::ppi::connector::PassiveConnector::emitUnthrottle()
00112 {
00113     SENF_PPI_THROTTLE_TRACE("OUT", "unthrottle");
00114     if (connected()) {
00115         peer().notifyUnthrottle();
00116         v_unthrottleEvent();
00117     }
00118 }
00119 
00120 prefix_ void senf::ppi::connector::PassiveConnector::notifyThrottle()
00121 {
00122     if (!throttled()) {
00123         remoteThrottled_ = true;
00124         emitThrottle();
00125     }
00126     else
00127         remoteThrottled_ = true;
00128 }
00129 
00130 // public members
00131 
00132 prefix_ bool senf::ppi::connector::PassiveConnector::nativeThrottled()
00133     const
00134 {
00135     return nativeThrottled_;
00136 }
00137 
00138 prefix_ void senf::ppi::connector::PassiveConnector::throttle()
00139 {
00140     if (!throttled()) {
00141         nativeThrottled_ = true;
00142         emitThrottle();
00143     } else
00144         nativeThrottled_ = true;
00145 }
00146 
00147 prefix_ void senf::ppi::connector::PassiveConnector::unthrottle()
00148 {
00149     if (throttled() && ! remoteThrottled_) {
00150         nativeThrottled_ = false;
00151         emitUnthrottle();
00152     } else
00153         nativeThrottled_ = false;
00154 
00155 }
00156 
00157 //-/////////////////////////////////////////////////////////////////////////////////////////////////
00158 // protected members
00159 
00160 prefix_ senf::ppi::connector::PassiveConnector::PassiveConnector()
00161     : callback_(), remoteThrottled_(), nativeThrottled_()
00162 {}
00163 
00164 prefix_ void senf::ppi::connector::PassiveConnector::emit()
00165 {
00166     // No event callback has been registered (onRequest() call missing)
00167     SENF_ASSERT(callback_, "senf::ppi::connector::PassiveConnector: missing onRequest()");
00168     if (!throttled()) {
00169         callback_();
00170     } else {
00171         SENF_PPI_THROTTLE_TRACE("IN ", "queueing packet");
00172     }
00173 }
00174 
00175 //-/////////////////////////////////////////////////////////////////////////////////////////////////
00176 // senf::ppi::connector::ActiveConnector
00177 
00178 prefix_ senf::ppi::connector::PassiveConnector & senf::ppi::connector::ActiveConnector::peer()
00179     const
00180 {
00181     SENF_ASSERT(peer_, "senf::ppi::connect() call missing");
00182     return *peer_;
00183 }
00184 
00185 prefix_ void senf::ppi::connector::ActiveConnector::onThrottle()
00186 {
00187     throttleCallback_ = Callback();
00188 }
00189 
00190 prefix_ void senf::ppi::connector::ActiveConnector::onUnthrottle()
00191 {
00192     unthrottleCallback_ = Callback();
00193 }
00194 
00195 prefix_ bool senf::ppi::connector::ActiveConnector::throttled()
00196     const
00197 {
00198     return ! connected() || peer().throttled();
00199 }
00200 
00201 //-/////////////////////////////////////////////////////////////////////////////////////////////////
00202 // protected members
00203 
00204 prefix_ senf::ppi::connector::ActiveConnector::ActiveConnector()
00205     : throttleCallback_(), unthrottleCallback_(), notifyRoutes_(), throttled_(false)
00206 {}
00207 
00208 //-/////////////////////////////////////////////////////////////////////////////////////////////////
00209 // senf::ppi::connector::InputConnector
00210 
00211 prefix_ senf::Packet senf::ppi::connector::InputConnector::read()
00212 {
00213     return operator()();
00214 }
00215 
00216 prefix_ senf::ppi::connector::OutputConnector & senf::ppi::connector::InputConnector::peer()
00217     const
00218 {
00219     SENF_ASSERT(peer_, "senf::ppi::connect() call missing");
00220     return *peer_;
00221 }
00222 
00223 prefix_ senf::ppi::connector::InputConnector::queue_iterator
00224 senf::ppi::connector::InputConnector::begin()
00225     const
00226 {
00227     return queue_.begin();
00228 }
00229 
00230 prefix_ senf::ppi::connector::InputConnector::queue_iterator
00231 senf::ppi::connector::InputConnector::end()
00232     const
00233 {
00234     return queue_.end();
00235 }
00236 
00237 prefix_ senf::Packet senf::ppi::connector::InputConnector::peek()
00238     const
00239 {
00240     // Cannot peek() head of empty queue
00241     SENF_ASSERT( ! queue_.empty(),
00242                  "senf::ppi::connector::InputConnector: cannot call peek() on empty queue" );
00243     return queue_.back();
00244 }
00245 
00246 prefix_ senf::ppi::connector::InputConnector::size_type
00247 senf::ppi::connector::InputConnector::queueSize()
00248     const
00249 {
00250     return queue_.size();
00251 }
00252 
00253 prefix_ bool senf::ppi::connector::InputConnector::empty()
00254     const
00255 {
00256     return queue_.empty();
00257 }
00258 
00259 //-/////////////////////////////////////////////////////////////////////////////////////////////////
00260 // protected members
00261 
00262 prefix_ senf::ppi::connector::InputConnector::InputConnector()
00263 {}
00264 
00265 //-/////////////////////////////////////////////////////////////////////////////////////////////////
00266 // private members
00267 
00268 prefix_ void senf::ppi::connector::InputConnector::enqueue(Packet const & p)
00269 {
00270     queue_.push_front(p);
00271     v_enqueueEvent();
00272 }
00273 
00274 //-/////////////////////////////////////////////////////////////////////////////////////////////////
00275 // senf::ppi::connector::OutputConnector
00276 
00277 prefix_ senf::ppi::connector::InputConnector & senf::ppi::connector::OutputConnector::peer()
00278     const
00279 {
00280     SENF_ASSERT(peer_, "senf::ppi::connect() call missing");
00281     return *peer_;
00282 }
00283 
00284 prefix_ void senf::ppi::connector::OutputConnector::operator()(Packet const & p)
00285 {
00286     SENF_PPI_TRACE(p, "OUT");
00287     if (connected())
00288         peer().enqueue(p);
00289 }
00290 
00291 prefix_ void senf::ppi::connector::OutputConnector::write(Packet const & p)
00292 {
00293     operator()(p);
00294 }
00295 
00296 //-/////////////////////////////////////////////////////////////////////////////////////////////////
00297 // protected members
00298 
00299 prefix_ senf::ppi::connector::OutputConnector::OutputConnector()
00300 {}
00301 
00302 //-/////////////////////////////////////////////////////////////////////////////////////////////////
00303 // senf::ppi::connector::GenericPassiveInput
00304 
00305 prefix_ senf::ppi::connector::GenericPassiveInput::GenericPassiveInput()
00306     : qdisc_(new ThresholdQueueing(1,0))
00307 {}
00308 
00309 prefix_ senf::ppi::connector::GenericActiveOutput & senf::ppi::connector::GenericPassiveInput::peer()
00310     const
00311 {
00312     SENF_ASSERT(peer_, "senf::ppi::connect() call missing");
00313     return *peer_;
00314 }
00315 
00316 prefix_ bool senf::ppi::connector::GenericPassiveInput::boolean_test()
00317     const
00318 {
00319     return ! empty();
00320 }
00321 
00322 //-/////////////////////////////////////////////////////////////////////////////////////////////////
00323 // senf::ppi::connector::GenericPassiveOutput
00324 
00325 prefix_ senf::ppi::connector::GenericActiveInput & senf::ppi::connector::GenericPassiveOutput::peer()
00326     const
00327 {
00328     SENF_ASSERT(peer_, "senf::ppi::connect() call missing");
00329     return *peer_;
00330 }
00331 
00332 prefix_ bool senf::ppi::connector::GenericPassiveOutput::boolean_test()
00333     const
00334 {
00335     return  true;
00336 }
00337 
00338 prefix_ void senf::ppi::connector::GenericPassiveOutput::connect(GenericActiveInput & target)
00339 {
00340     Connector::connect(target);
00341 }
00342 
00343 prefix_ senf::ppi::connector::GenericPassiveOutput::GenericPassiveOutput()
00344 {}
00345 
00346 //-/////////////////////////////////////////////////////////////////////////////////////////////////
00347 // senf::ppi::connector::GenericActiveInput
00348 
00349 prefix_ senf::ppi::connector::GenericPassiveOutput & senf::ppi::connector::GenericActiveInput::peer()
00350     const
00351 {
00352     SENF_ASSERT(peer_, "senf::ppi::connect() call missing");
00353     return *peer_;
00354 }
00355 
00356 prefix_ bool senf::ppi::connector::GenericActiveInput::boolean_test()
00357     const
00358 {
00359     return ! empty() || (connected() && ! peer().throttled());
00360 }
00361 
00362 prefix_ void senf::ppi::connector::GenericActiveInput::request()
00363 {
00364     if (connected())
00365         peer().emit();
00366 }
00367 
00368 prefix_ senf::ppi::connector::GenericActiveInput::GenericActiveInput()
00369 {}
00370 
00371 //-/////////////////////////////////////////////////////////////////////////////////////////////////
00372 // senf::ppi::connector::GenericActiveOutput
00373 
00374 prefix_ senf::ppi::connector::GenericPassiveInput & senf::ppi::connector::GenericActiveOutput::peer()
00375     const
00376 {
00377     SENF_ASSERT(peer_, "senf::ppi::connect() call missing");
00378     return *peer_;
00379 }
00380 
00381 prefix_ bool senf::ppi::connector::GenericActiveOutput::boolean_test()
00382     const
00383 {
00384     return connected() && ! peer().throttled();
00385 }
00386 
00387 prefix_ void senf::ppi::connector::GenericActiveOutput::connect(GenericPassiveInput & target)
00388 {
00389     Connector::connect(target);
00390 }
00391 
00392 prefix_ senf::ppi::connector::GenericActiveOutput::GenericActiveOutput()
00393 {}
00394 
00395 //-/////////////////////////////////////////////////////////////////////////////////////////////////
00396 #undef prefix_
00397 
00398 
00399 // Local Variables:
00400 // mode: c++
00401 // fill-column: 100
00402 // comment-column: 40
00403 // c-file-style: "senf"
00404 // indent-tabs-mode: nil
00405 // ispell-local-dictionary: "american"
00406 // compile-command: "scons -u test"
00407 // End:

Contact: senf-dev@lists.berlios.de | © 2006-2010 Fraunhofer Institute for Open Communication Systems, Network Research