]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
Event: use multimap instead of map
authorHaomai Wang <haomai@xsky.com>
Tue, 24 May 2016 07:23:50 +0000 (15:23 +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 eb20406774e7d1d77a3630f4e5cc5272d3292eb3..ff535c7b8196524f528cf50e31f6e5e7aef31803 100644 (file)
@@ -232,7 +232,7 @@ 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].push_back(event);
+  time_events[expire] = event;
   if (expire < next_time)
     wakeup();
 
@@ -248,14 +248,9 @@ void EventCenter::delete_time_event(uint64_t id)
     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 ;
     }
   }
 }
@@ -294,19 +289,15 @@ int EventCenter::process_time_events()
   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;
     }
index 4618c156b0d927b3dc95df502fe376b5f3000e58..14c3ab429cce2f479e539942898c20ebbf2a6f50 100644 (file)
@@ -109,7 +109,7 @@ class EventCenter {
   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