clock_type::time_point expire = clock_type::now() + std::chrono::microseconds(microseconds);
event.id = id;
event.time_cb = ctxt;
- time_events[expire].push_back(event);
+ time_events[expire] = event;
if (expire < next_time)
wakeup();
return ;
for (auto it = time_events.begin(); it != time_events.end(); ++it) {
- for (list<TimeEvent>::iterator j = it->second.begin();
- j != it->second.end(); ++j) {
- if (j->id == id) {
- it->second.erase(j);
- if (it->second.empty())
- time_events.erase(it);
- return ;
- }
+ if (it->second.id == id) {
+ time_events.erase(it);
+ return ;
}
}
}
while (!time_events.empty()) {
auto it = time_events.begin();
if (now >= it->first || clock_skewed) {
- if (it->second.empty()) {
- time_events.erase(it);
- } else {
- TimeEvent &e = it->second.front();
- EventCallbackRef cb = e.time_cb;
- uint64_t id = e.id;
- it->second.pop_front();
- ldout(cct, 10) << __func__ << " process time event: id=" << id << dendl;
- processed++;
- time_lock.Unlock();
- cb->do_request(id);
- time_lock.Lock();
- }
+ TimeEvent &e = it->second;
+ EventCallbackRef cb = e.time_cb;
+ uint64_t id = e.id;
+ time_events.erase(it);
+ ldout(cct, 10) << __func__ << " process time event: id=" << id << dendl;
+ processed++;
+ time_lock.Unlock();
+ cb->do_request(id);
+ time_lock.Lock();
} else {
break;
}
deque<EventCallbackRef> external_events;
vector<FileEvent> file_events;
EventDriver *driver;
- map<clock_type::time_point, list<TimeEvent> > time_events;
+ multimap<clock_type::time_point, TimeEvent> time_events;
uint64_t time_event_next_id;
clock_type::time_point last_time; // last time process time event
clock_type::time_point next_time; // next wake up time