bool Map::doProcessOneEvent() { commandQueue_.runCommands(); // search next event while (nowItr_->second->empty()) { if (events_.size() == 1) { // No more events left! return false; } else { delete events_.begin()->second; events_.erase(events_.begin()); } nowItr_ = events_.begin(); } assure(!nowItr_->second->empty(), "There MUST be events!"); // get next event EventPtr nextEvent = nowItr_->second->front(); wns::simulator::Time newTime = nextEvent->getScheduled(); // run until all now events are processed if (simTime_ < newTime) { if(stop_) { return false; } onNewSimTime(newTime); } simTime_ = newTime; nextEvent->state_ = Event::Running; (*nextEvent)(); nextEvent->state_ = Event::Finished; // remove the event nowItr_->second->pop_front(); return true; }
wns::events::scheduler::IEventPtr Map::doSchedule(const Callable& callable, wns::simulator::Time at) { EventPtr event (new wns::events::scheduler::Map::Event(callable)); event->scheduler_ = this; event->issued_ = getTime(); event->scheduled_ = at; EventContainer::iterator itr = events_.find(event->getScheduled()); if (itr == events_.end()) { DiscreteTimeContainer* dtc = new DiscreteTimeContainer(); // we need to add a new list dtc->push_back(event); events_[at] = dtc; } else { itr->second->push_back(event); } event->state_ = Event::Queued; return event; }