00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00026
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
00044
00045 prefix_ senf::ppi::connector::Connector & senf::ppi::connector::Connector::peer()
00046 const
00047 {
00048
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
00057
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
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
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
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
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
00159
00160 prefix_ senf::ppi::connector::PassiveConnector::PassiveConnector()
00161 : callback_(), remoteThrottled_(), nativeThrottled_()
00162 {}
00163
00164 prefix_ void senf::ppi::connector::PassiveConnector::emit()
00165 {
00166
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
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
00203
00204 prefix_ senf::ppi::connector::ActiveConnector::ActiveConnector()
00205 : throttleCallback_(), unthrottleCallback_(), notifyRoutes_(), throttled_(false)
00206 {}
00207
00208
00209
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
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
00261
00262 prefix_ senf::ppi::connector::InputConnector::InputConnector()
00263 {}
00264
00265
00266
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
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
00298
00299 prefix_ senf::ppi::connector::OutputConnector::OutputConnector()
00300 {}
00301
00302
00303
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
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
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
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
00400
00401
00402
00403
00404
00405
00406
00407