![]() |
User Manual, Developers Guide and API Documentation |
![]() |
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
1.5.5