Example #1
0
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;
}
Example #2
0
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;
}