From 6e24d9a334bbfbb1c16cd1da78b364114e9bb854 Mon Sep 17 00:00:00 2001 From: Haomai Wang Date: Tue, 24 May 2016 16:34:19 +0800 Subject: [PATCH] Event: implement effective delete_time_event Signed-off-by: Haomai Wang --- src/msg/async/Event.cc | 17 ++++++++++------- src/msg/async/Event.h | 3 ++- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/msg/async/Event.cc b/src/msg/async/Event.cc index 9549c3ebc4f93..eb67b0bd1c1c2 100644 --- a/src/msg/async/Event.cc +++ b/src/msg/async/Event.cc @@ -230,12 +230,13 @@ uint64_t EventCenter::create_time_event(uint64_t microseconds, EventCallbackRef clock_type::time_point expire = clock_type::now() + std::chrono::microseconds(microseconds); event.id = id; event.time_cb = ctxt; - time_events[expire] = event; + std::multimap::value_type s_val(expire, event); + auto it = time_events.insert(std::move(s_val)); + event_map[id] = it; return id; } -// TODO: Ineffective implementation now! void EventCenter::delete_time_event(uint64_t id) { assert(in_thread()); @@ -243,12 +244,13 @@ void EventCenter::delete_time_event(uint64_t id) if (id >= time_event_next_id) return ; - for (auto it = time_events.begin(); it != time_events.end(); ++it) { - if (it->second.id == id) { - time_events.erase(it); - return ; - } + auto it = event_map.find(id); + if (it == event_map.end()) { + ldout(cct, 10) << __func__ << " id=" << id << " not found" << dendl; + return ; } + + time_events.erase(it->second); } void EventCenter::wakeup() @@ -277,6 +279,7 @@ int EventCenter::process_time_events() EventCallbackRef cb = e.time_cb; uint64_t id = e.id; time_events.erase(it); + event_map.erase(id); ldout(cct, 10) << __func__ << " process time event: id=" << id << dendl; processed++; cb->do_request(id); diff --git a/src/msg/async/Event.h b/src/msg/async/Event.h index 09a9b781c945f..a44f793fec837 100644 --- a/src/msg/async/Event.h +++ b/src/msg/async/Event.h @@ -113,7 +113,8 @@ class EventCenter { deque external_events; vector file_events; EventDriver *driver; - multimap time_events; + std::multimap time_events; + std::map::iterator> event_map; uint64_t time_event_next_id; int notify_receive_fd; int notify_send_fd; -- 2.39.5