]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
Event: implement effective delete_time_event
authorHaomai Wang <haomai@xsky.com>
Tue, 24 May 2016 08:34:19 +0000 (16:34 +0800)
committerHaomai Wang <haomai@xsky.com>
Wed, 29 Jun 2016 04:14:04 +0000 (12:14 +0800)
Signed-off-by: Haomai Wang <haomai@xsky.com>
src/msg/async/Event.cc
src/msg/async/Event.h

index 9549c3ebc4f93ae5dcb89965303786d41b280a13..eb67b0bd1c1c241a3dc6460b1e7dcad6cf1c95cc 100644 (file)
@@ -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<clock_type::time_point, TimeEvent>::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);
index 09a9b781c945f597f84ceed4af4b32c2fa4ccc79..a44f793fec837f0792990cc235aff7ca742d73da 100644 (file)
@@ -113,7 +113,8 @@ class EventCenter {
   deque<EventCallbackRef> external_events;
   vector<FileEvent> file_events;
   EventDriver *driver;
-  multimap<clock_type::time_point, TimeEvent> time_events;
+  std::multimap<clock_type::time_point, TimeEvent> time_events;
+  std::map<uint64_t, std::multimap<clock_type::time_point, TimeEvent>::iterator> event_map;
   uint64_t time_event_next_id;
   int notify_receive_fd;
   int notify_send_fd;