User Manual, Developers Guide and API Documentation

Scheduler.cpp

Go to the documentation of this file.
00001 /*******************************************************************************
00002  * This file is part of openWNS (open Wireless Network Simulator)
00003  * _____________________________________________________________________________
00004  *
00005  * Copyright (C) 2004-2009
00006  * Chair of Communication Networks (ComNets)
00007  * Kopernikusstr. 5, D-52074 Aachen, Germany
00008  * phone: ++49-241-80-27910,
00009  * fax: ++49-241-80-22242
00010  * email: info@openwns.org
00011  * www: http://www.openwns.org
00012  * _____________________________________________________________________________
00013  *
00014  * openWNS is free software; you can redistribute it and/or modify it under the
00015  * terms of the GNU Lesser General Public License version 2 as published by the
00016  * Free Software Foundation;
00017  *
00018  * openWNS is distributed in the hope that it will be useful, but WITHOUT ANY
00019  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
00020  * A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
00021  * details.
00022  *
00023  * You should have received a copy of the GNU Lesser General Public License
00024  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
00025  *
00026  ******************************************************************************/
00027 
00028 
00029 #include <WIMAC/scheduler/Scheduler.hpp>
00030 
00031 #include <boost/filesystem/fstream.hpp>
00032 #include <boost/filesystem/path.hpp>
00033 
00034 #include <WNS/ldk/Compound.hpp>
00035 #include <WNS/ldk/Deliverer.hpp>
00036 #include <WNS/service/phy/ofdma/Handler.hpp>
00037 #include <WNS/scheduler/strategy/Strategy.hpp>
00038 #include <WNS/probe/bus/ContextProviderCollection.hpp>
00039 #include <WNS/probe/bus/utils.hpp>
00040 
00041 #include <WIMAC/Component.hpp>
00042 #include <WIMAC/PhyUser.hpp>
00043 #include <WIMAC/PhyAccessFunc.hpp>
00044 #include <WIMAC/Utilities.hpp>
00045 #include <WIMAC/scheduler/PseudoBWRequestGenerator.hpp>
00046 #include <WIMAC/scheduler/Callback.hpp>
00047 #include <WIMAC/parameter/PHY.hpp>
00048 #include <WIMAC/scheduler/RegistryProxyWiMAC.hpp>
00049 #include <WIMAC/FUConfigCreator.hpp>
00050 #include <WIMAC/frame/ULMapCollector.hpp>
00051 #include <WIMAC/frame/DataCollector.hpp>
00052 
00053 STATIC_FACTORY_REGISTER_WITH_CREATOR(
00054     wimac::scheduler::Scheduler,
00055     wimac::scheduler::Interface,
00056     "wimac.scheduler.Scheduler",
00057         wimac::FUConfigCreator );
00058 
00059 using namespace wimac::scheduler;
00060 
00061 Scheduler::Scheduler(wns::ldk::FunctionalUnit* parent, const wns::pyconfig::View& config) :
00062     plotFrames(config.get<bool>("plotFrames")),
00063     usedSlotDuration(0.0),
00064     offsetInSlot(0.0),
00065         slotDuration(config.get<double>("slotDuration")),
00066     freqChannels(config.get<int>("freqChannels")),
00067     maxBeams(config.get<int>("maxBeams")),
00068     beamforming(config.get<bool>("beamforming")),
00069     numberOfTimeSlots_(config.get<int>("numberOfTimeSlots")),
00070     uplink(config.get<bool>("uplink")),
00071     alwaysAcceptIfQueueAccepts(config.get<bool>("alwaysAcceptIfQueueAccepts")),
00072     logger("W-NS", "Scheduler",
00073            wns::simulator::getMasterLogger()),
00074     ofdmaProvider(0),
00075     strategyName(config.get<std::string>("strategy.nameInStrategyFactory")),
00076     grouperName(config.get<std::string>("grouper.nameInGrouperFactory")),
00077     queueName(config.get<std::string>("queue.nameInQueueFactory")),
00078     registryName(config.get<std::string>("registry.nameInRegistryProxyFactory")),
00079     callbackName(config.get<std::string>("callback.__plugin__")),
00080     duration_(0.0),
00081     pduCount(0),
00082     frameNo(0),
00083     pyConfig(config),
00084     resetedBitsProbe(),
00085     resetedCompoundsProbe(),
00086     parent_(parent),
00087     accepting_(false),
00088     mapHandler_(0),
00089     mapHandlerName_( config.get<std::string>("mapHandlerName") )
00090 {
00091     strategyResult_ = wns::scheduler::strategy::StrategyResultPtr();
00092     outputDir = "output";
00093 
00094     wns::probe::bus::ContextProviderCollection& cpc =
00095         parent_->getFUN()->getLayer()->getContextProviderCollection();
00096 
00097     resetedBitsProbe = wns::probe::bus::collector(cpc, config, "resettedBitsProbeBusName");
00098     resetedCompoundsProbe = wns::probe::bus::collector(cpc, config, "resettedCompoundsProbeBusName");
00099 
00100     colleagues.grouper = 0;
00101     colleagues.queue = 0;
00102     colleagues.strategy = 0;
00103     colleagues.registry = 0;
00104     colleagues.pseudoGenerator = 0;
00105     colleagues.callback = 0;
00106     colleagues.harq = 0;
00107 
00108 
00109     if (!config.isNone("pseudoGenerator"))
00110     {
00111         colleagues.pseudoGenerator =
00112             new wimac::scheduler::PseudoBWRequestGenerator(config.getView("pseudoGenerator"));
00113     }
00114 
00115     wns::pyconfig::View registryView =
00116         pyConfig.get<wns::pyconfig::View>("registry");
00117     wns::scheduler::RegistryCreator* registryCreator =
00118         wns::scheduler::RegistryFactory::creator(registryName);
00119     colleagues.registry = dynamic_cast<wimac::scheduler::RegistryProxyWiMAC*>
00120         (registryCreator->create(parent_->getFUN(), registryView));
00121     assure(colleagues.registry, "Registry creation failed");
00122 }
00123 
00124 Scheduler::~Scheduler()
00125 {
00126     if ( colleagues.strategy )
00127         delete colleagues.strategy;
00128 
00129     if ( colleagues.queue )
00130         delete colleagues.queue;
00131 
00132     if ( colleagues.grouper )
00133         delete colleagues.grouper;
00134 
00135     if ( colleagues.registry )
00136         delete colleagues.registry;
00137 
00138     if ( colleagues.callback )
00139         delete colleagues.callback;
00140 
00141     if ( colleagues.harq )
00142         delete colleagues.harq;
00143 
00144     if ( colleagues.pseudoGenerator )
00145         delete colleagues.pseudoGenerator;
00146     strategyResult_= wns::scheduler::strategy::StrategyResultPtr();
00147 }
00148 
00149 void Scheduler::schedule(const wns::ldk::CompoundPtr& compound)
00150 {
00151     assure(doIsAccepting(compound), "sendData called but not isAccepting");
00152     LOG_INFO("Forwarding accepted PDU to queue.");
00153     colleagues.queue->put(compound);
00154 }
00155 
00156 bool Scheduler::doIsAccepting(const wns::ldk::CompoundPtr& compound) const
00157 {
00158     if(alwaysAcceptIfQueueAccepts)
00159     return colleagues.queue->isAccepting(compound);
00160     else
00161         return accepting_ && colleagues.queue->isAccepting(compound);
00162 }
00163 
00164 void Scheduler::resetAllQueues()
00165 {
00166     colleagues.queue->resetAllQueues();
00167 }
00168 
00169 void
00170 Scheduler::notifyAboutConnectionDeleted(const ConnectionIdentifier cid)
00171 {
00172     if( colleagues.queue->hasQueue(cid.getID()) )
00173     {
00174         LOG_INFO( parent_->getFUN()->getName(),
00175                   ": Scheduler deleting Queue for CID: ", cid.getID() );
00176 
00177         wns::scheduler::queue::QueueInterface::ProbeOutput probeOutput;
00178         probeOutput = colleagues.queue->resetQueue(cid.getID());
00179 
00180         // put Probe
00181         if(cid.connectionType_ == ConnectionIdentifier::Data)
00182             this->putProbe(probeOutput.bits, probeOutput.compounds);
00183     }
00184 }
00185 
00186 void
00187 Scheduler::deliverSchedule(wns::ldk::Connector* connector)
00188 {
00189 
00190     if (schedulerSpot_ == wns::scheduler::SchedulerSpot::ULSlave()) 
00191     {
00192         if (mapHandler_->resourcesGranted())
00193         {
00194             /****************** Scheduling Phase ****************************************/
00195             // trigger the scheduling process of the strategy module
00196             wns::scheduler::strategy::StrategyInput strategyInput(freqChannels, 
00197                 slotDuration, 
00198                 numberOfTimeSlots_, 
00199                 maxBeams,
00200                 NULL);
00201 
00202             strategyInput.beamforming = beamforming;
00203             strategyInput.setInputSchedulingMap(mapHandler_->getMasterMapForSlaveScheduling());
00204 
00205             strategyResult_ = wns::scheduler::strategy::StrategyResultPtr(
00206             new wns::scheduler::strategy::StrategyResult(colleagues.strategy->startScheduling(strategyInput))); 
00207 
00208             if (strategyResult_ == wns::scheduler::strategy::StrategyResultPtr())
00209             {
00210                 LOG_INFO(parent_->getFUN()->getName(), 
00211                     ": ULSlave::deliverSchedule: Resources granted but no Compounds to schedule");
00212                 return;//empty map do nothing
00213             }
00214             LOG_INFO(parent_->getFUN()->getName(), 
00215                 ": ULSlave::deliverSchedule: ULSlaveCallback will now finalize the schedule.");
00216             colleagues.callback->callBack(strategyResult_->schedulingMap);
00217         }
00218         else
00219         {
00220             LOG_INFO(parent_->getFUN()->getName(), 
00221                 ": ULSlave::deliverSchedule: No resources granted");
00222             return; //ULSlave scheduling not required without granted resources
00223         }
00224     }
00225 
00226     colleagues.callback->deliverNow(connector);
00227 }
00228 
00229 void
00230 Scheduler::setupPlotting()
00231 {
00232     std::string direction = uplink ? std::string("UL") : std::string("DL");
00233     std::stringstream configFilename;
00234     configFilename << parent_->getFUN()->getLayer()->getName() << "_"
00235                    <<  direction
00236                    << "_frame_" << frameNo << ".conf";
00237 
00238     boost::filesystem::path ssConf(outputDir);
00239     ssConf /= configFilename.str();
00240     std::stringstream ssPlot;
00241 
00242 
00243     boost::filesystem::ofstream conf(ssConf);
00244 
00245     conf << "[main]\n";
00246     conf << "FreqChannels=" << freqChannels << "\n"
00247          << "Beams=" << maxBeams << "\n"
00248          << "StartTime=0.0\n"
00249          << "EndTime=" << this->getDuration() << "\n";
00250     conf.close();
00251 
00252     plotFiles.clear();
00253     for (unsigned int i = 0; i < freqChannels; ++i)
00254     {
00255         plotFiles.push_back(new boost::filesystem::fstream);
00256         std::stringstream plotFilename;
00257         plotFilename << parent_->getFUN()->getLayer()->getName() << "_"
00258                      << direction
00259                      << "_frame_" << frameNo << ".plot." << i;
00260         boost::filesystem::path ssPlot(outputDir);
00261         ssPlot /= plotFilename.str();
00262         plotFiles[i]->open(ssPlot);
00263         // format flags for the timestamps: always print 9 digits for float,
00264         plotFiles[i]->flags( std::ios_base::fixed );
00265         plotFiles[i]->precision(9);
00266     }
00267 }
00268 
00269 void
00270 Scheduler::startScheduling()
00271 {
00272     if (plotFrames)
00273         setupPlotting();
00274 
00275     accepting_ = true;
00276 
00277     if (colleagues.pseudoGenerator)
00278         colleagues.pseudoGenerator->wakeup();
00279     else
00280         receptor_->wakeup();
00281 
00282     accepting_ = false;
00283 
00284     if(schedulerSpot_ == wns::scheduler::SchedulerSpot::ULSlave())
00285         return;
00286 
00287     assure(slotDuration * numberOfTimeSlots_ < getDuration(),
00288         "Too many resources (" << numberOfTimeSlots_ << " * " << slotDuration 
00289         << "s = " << slotDuration * numberOfTimeSlots_ 
00290         << "s) to fit in data phase of duration " << getDuration() << "s");
00291 
00292     /****************** Scheduling Phase ****************************************/
00293     // trigger the scheduling process of the strategy module
00294     wns::scheduler::strategy::StrategyInput strategyInput(freqChannels, 
00295         slotDuration, 
00296         numberOfTimeSlots_, 
00297         maxBeams,
00298         NULL);
00299         //colleagues.callback);
00300 
00301     strategyInput.beamforming = beamforming;
00302 
00303     strategyResult_ = wns::scheduler::strategy::StrategyResultPtr(
00304         new wns::scheduler::strategy::StrategyResult(colleagues.strategy->startScheduling(strategyInput))); 
00305 
00306     // TODO: move to Scheduler::finishCollection() 
00307     LOG_INFO(parent_->getFUN()->getName(), " Scheduler::finishCollection() in Scheduler::startScheduling(). numberOfTimeSlots_: ", numberOfTimeSlots_, " slotDuration: ", slotDuration);
00308     if (strategyResult_ == wns::scheduler::strategy::StrategyResultPtr())
00309     {
00310            return;//empty map do nothing
00311     }
00312 
00313     //ULMaster requires CallBack only with beamforming
00314     if(schedulerSpot_ != wns::scheduler::SchedulerSpot::ULMaster() || beamforming)
00315     { 
00316         colleagues.callback->callBack(strategyResult_->schedulingMap);
00317     }
00318 
00319     if (schedulerSpot_ == wns::scheduler::SchedulerSpot::ULMaster())
00320     {
00321         LOG_INFO(parent_->getFUN()->getName(), " deleteCompoundsInBursts()+deleteCompounds()");
00322         strategyResult_->deleteCompoundsInBursts(); // MapInfoCollection is not needed anymore
00323         strategyResult_->schedulingMap->deleteCompounds(); // compounds are not needed anymore
00324         strategyResult_->schedulingMap->grantFullResources(); // full time length on used subchannels (only for resourceUsage probe and plot)
00325         //strategyResult_->schedulingMap->processMasterMap(); // must be done in slave,peer,UT
00326     }
00327 }
00328 
00329 void
00330 Scheduler::finishCollection() 
00331 { 
00332        LOG_INFO(parent_->getFUN()->getName(), " Scheduler::finishCollection(): ");
00333 //     if (strategyResult_ == wns::scheduler::strategy::StrategyResultPtr() || schedulerSpot_==wns::scheduler::SchedulerSpot::ULMaster())
00334 //     {
00335 //            return; //empty map or ulmaster nothing to do
00336 //     }
00337 //     colleagues.callback->callBack(strategyResult_->schedulingMap);
00338 
00339     if (plotFrames) {
00340         for (unsigned int i = 0; i < freqChannels; ++i) {
00341             plotFiles[i]->close();
00342             delete plotFiles[i];
00343         }
00344     }
00345     frameNo++;
00346 }
00347 
00348 void Scheduler::setFUN(wns::ldk::fun::FUN* fun)
00349 {
00350     assure(fun == parent_->getFUN(), "my fun and parent's fun do not match");
00351 
00352 
00353     LOG_INFO(parent_->getFUN()->getName(),
00354              "Scheduler::setFUN() called and now setting up friends and colleagues");
00355 
00356     mapHandler_= fun->findFriend< wimac::frame::MapHandlerInterface*>(mapHandlerName_);
00357     assure( mapHandler_, "mapcollector not of type wimac::scheduler::MapHandler");
00358 
00359     // the first thing to do is to set up the registry because other colleagues
00360     // may depend on it for their initialization
00361 
00362     colleagues.registry->setFUN(fun);
00363 
00364     if (!ofdmaProvider) {
00365 
00366         friends_.phyUser = fun->findFriend<wimac::PhyUser*>("phyUser");
00367         assure(friends_.phyUser, "Could not get phyUser from my FUN");
00368 
00369         ofdmaProvider = friends_.phyUser->getDataTransmissionService();
00370         assure(ofdmaProvider, "Could not get OFDMA Provider from PhyUser");
00371 
00372     }
00373 
00374     friends_.classifier = fun->findFriend<wns::ldk::CommandTypeSpecifier
00375         <wns::ldk::ClassifierCommand> *>("classifier");
00376     assure(friends_.classifier, "Could not get the Classifier from my FUN");
00377 
00378     service::ConnectionManager* connectionManager = dynamic_cast<wimac::Component*>
00379         (parent_->getFUN()->getLayer())->getManagementService<service::ConnectionManager>("connectionManager");
00380 
00381     startObserving(connectionManager);
00382 
00383     colleagues.registry->setFriends(friends_.classifier);
00384 
00385 
00386     // create the modules
00387     wns::scheduler::grouper::SpatialGrouperCreator* grouperCreator =
00388         wns::scheduler::grouper::SpatialGrouperFactory::creator(grouperName);
00389     colleagues.grouper = grouperCreator->create(pyConfig.getView("grouper"));
00390     assure(colleagues.grouper, "Grouper creation failed");
00391 
00392     wns::pyconfig::View queueView = pyConfig.get<wns::pyconfig::View>("queue");
00393     wns::scheduler::queue::QueueCreator* queueCreator =
00394         wns::scheduler::queue::QueueFactory::creator(queueName);
00395         colleagues.queue = queueCreator->create( parent_, queueView );
00396     assure(colleagues.queue, "Queue creation failed");
00397 
00398     colleagues.queue->setFUN(fun);
00399     colleagues.queue->setColleagues(colleagues.registry);
00400 
00401     wns::scheduler::strategy::StrategyCreator* strategyCreator =
00402         wns::scheduler::strategy::StrategyFactory::creator(strategyName);
00403     colleagues.strategy = strategyCreator->create(pyConfig.get<wns::pyconfig::View>("strategy"));
00404     assure(colleagues.strategy, "Strategy module creation failed");
00405 
00406     wimac::scheduler::CallbackCreator* callbackCreator =
00407         wimac::scheduler::CallbackFactory::creator(callbackName);
00408     colleagues.callback = callbackCreator->create(fun, pyConfig.getView("callback"));
00409     assure(colleagues.callback, "Callback creation failed");
00410 
00411     colleagues.harq = STATIC_FACTORY_NEW_INSTANCE(
00412         wns::scheduler::harq::HARQInterface, 
00413         wns::PyConfigViewCreator, 
00414         pyConfig.get("harq"), 
00415         pyConfig.get("harq"));
00416     assure(colleagues.harq, "HARQ creation failed");
00417 
00418     /* UL Master HARQ needs to know about DownlinkHARQ */
00419     if(schedulerSpot_ == wns::scheduler::SchedulerSpot::ULMaster())
00420     {
00421         wimac::scheduler::Scheduler* sched = dynamic_cast<wimac::scheduler::Scheduler*>(
00422             fun->findFriend<frame::DataCollector*>("dlscheduler")->getTxScheduler());
00423         assure(sched, "Cannot find downlink scheduler in ULMaster");
00424 
00425         wns::scheduler::harq::HARQInterface* dlHARQ = sched->colleagues.harq;
00426         assure(dlHARQ, "Cannot find downlink HARQ in ULMaster");
00427 
00428         colleagues.harq->setDownlinkHARQ(dlHARQ);
00429     }
00430 
00431     // tell the modules who friends and colleagues are
00432     colleagues.grouper->setColleagues(colleagues.registry);
00433     colleagues.strategy->setColleagues(colleagues.queue,
00434                        colleagues.grouper,
00435                        colleagues.registry,
00436                        colleagues.harq
00437                        );
00438 
00439     colleagues.callback->setColleagues(colleagues.registry, colleagues.harq);
00440     colleagues.grouper->setFriends(ofdmaProvider);
00441     colleagues.strategy->setFriends(ofdmaProvider);
00442 
00443     if (colleagues.pseudoGenerator)
00444     {
00445         colleagues.pseudoGenerator->setFUN(fun);
00446         colleagues.pseudoGenerator->setScheduler(this);
00447     }
00448     schedulerSpot_ = colleagues.strategy->getSchedulerSpotType();
00449 }
00450 
00451 
00452 void
00453 Scheduler::setProvider(wns::service::phy::ofdma::DataTransmission* _ofdmaProvider) {
00454     ofdmaProvider = _ofdmaProvider;
00455 }
00456 
00457 wns::scheduler::SchedulingMapPtr
00458 Scheduler::getSchedulingMap() const {
00459     assure(strategyResult_, "StrategyResult not present");
00460     return strategyResult_->schedulingMap;
00461 }
00462 
00463 // wns::scheduler::MapInfoCollectionPtr
00464 // Scheduler::getMapInfo() const {
00465 //     assure(colleagues.strategy, "Strategy module not present");
00466 // 
00467 //     return colleagues.strategy->getMapInfo();
00468 // }
00469 
00470 int
00471 Scheduler::getNumBursts() const {
00472     assure(strategyResult_, "Strategy module not present");
00473     int numOfSlots = 5;
00474     return strategyResult_->schedulingMap->getNumberOfSubChannels() * numOfSlots;
00475 }
00476 
00477 void
00478 Scheduler::handleBroadcast()
00479 {
00481 
00482 //  bool frameFull = false;
00483 
00484 //  // do we have a broadcast queue with backlogged pdus?
00485 //  if (colleagues.queue->hasQueue(0))
00486 //  {
00487 //      if (colleagues.queue->queueHasPDUs(0))
00488 //      {
00489 //          do {
00490 //              const wns::service::phy::phymode::PhyModeInterface& phyMode
00491 //                  = colleagues.registry->getPhyModeMapper()->getLowestPhyMode();
00492 
00493 //              double dataRate =
00494 //                  //PHYTools::getBitsPerSymbol( PHYTools::BPSK12 ) * 1.0 / this->getFrameBuilder()->getSymbolDuration();
00495 //                  //phyMode.getBitsPerSymbol() / this->getFrameBuilder()->getSymbolDuration();
00496 //                  phyMode.getDataRate();
00497 
00498 //              wns::scheduler::Bits size = colleagues.queue->getHeadOfLinePDUbits(0);
00499 
00500 //              simTimeType duration = (double(size) / dataRate);
00501 
00502 
00503 //              if (duration  < (this->getMaximumDuration() - usedSlotDuration))
00504 //              {
00505 
00506 //                  // if the broadcast fits, get the pdu and set the relevant
00507 //                  // commands
00508 
00509 //                  wns::ldk::CompoundPtr pdu = colleagues.queue->getHeadOfLinePDU(0);
00510 
00511 //                  BroadcastPhyAccessFunc* func = new BroadcastPhyAccessFunc;
00512 //                  func->transmissionStart_ = usedSlotDuration;
00513 //                  func->transmissionStop_ =  usedSlotDuration + duration;
00514 
00515 
00516 //                  // set PhyUser command
00517 //                  wimac::PhyUserCommand* phyCommand = dynamic_cast<wimac::PhyUserCommand*>(
00518 //                      parent_->getFUN()->getProxy()->activateCommand( pdu->getCommandPool(), friends_.phyUser ) );
00519 
00520 //                  phyCommand->local.pAFunc_.reset( func );
00521 
00522 //                  phyCommand->peer.destination_ = 0;
00523 //                  wimac::Component* wimacLayer = dynamic_cast<wimac::Component*>(parent_->getFUN()->getLayer());
00524 //                  phyCommand->peer.cellID_ = wimacLayer->getCellID();
00525 //                  phyCommand->peer.source_ = wimacLayer->getNode();
00526 //                  //phyCommand->peer.phyMode_ = wimac::PHYTools::BPSK12;
00527 //                  //phyCommand->peer.phyMode_ = colleagues.registry->getPhyModeMapper()->getLowestPhyMode(); // TODO
00528 //                  phyCommand->peer.phyModePtr = &colleagues.registry->getPhyModeMapper()->getLowestPhyMode(); // TODO
00529 //                  phyCommand->peer.measureInterference_ = false;
00530 //                  phyCommand->magic.sourceLayer2_ = wimacLayer;
00531 
00532 //                  if (plotFrames)
00533 //                      *plotFiles[0] << usedSlotDuration << "\t" <<  usedSlotDuration + duration << "\t"
00534 //                                        << float(0) << "\t" << 0.999 << "\t\"" << "BC" << "\"\n";
00535 
00536 
00537 //                  this->pduWatch(pdu);  // Watch for special compounds to inform its observer
00538 //                  scheduledPDUs.push(pdu);
00539 
00540 //                  MESSAGE_SINGLE(NORMAL, logger, "Scheduled a broadcast PDU");
00541 
00542 //                  usedSlotDuration += duration;
00543 //              }
00544 //              else
00545 //                  frameFull = true;
00546 
00547 //          } while (colleagues.queue->queueHasPDUs(0) && !frameFull);
00548 //      }
00549 //  }
00550 }
00551 
00552 void
00553 Scheduler::putProbe(int bits, int compounds)
00554 {
00555     if(resetedBitsProbe)
00556         resetedBitsProbe->put(bits);
00557 
00558     if(resetedCompoundsProbe)
00559         resetedCompoundsProbe->put(compounds);
00560 }
00561 
00562 wns::scheduler::queue::QueueInterface* 
00563 Scheduler::getQueue() const
00564 {
00565     return colleagues.queue;    
00566 }
00567 

Generated on Fri May 25 03:32:15 2012 for openWNS by  doxygen 1.5.5