]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
Event: Use array instead of unordered_map for file_events
authorHaomai Wang <haomaiwang@gmail.com>
Sat, 27 Sep 2014 15:33:47 +0000 (23:33 +0800)
committerHaomai Wang <haomaiwang@gmail.com>
Wed, 8 Oct 2014 06:04:59 +0000 (14:04 +0800)
Signed-off-by: Haomai Wang <haomaiwang@gmail.com>
src/msg/Event.cc
src/msg/Event.h

index a5c6314345f64f9cbef8e1a269592e99ac4eb6da..2aa99bc397f11b0ae03bd08ea63adb4f8c740767 100644 (file)
@@ -60,6 +60,8 @@ int EventCenter::init(int n)
 
   notify_receive_fd = fds[0];
   notify_send_fd = fds[1];
+  file_events = (FileEvent *)malloc(sizeof(FileEvent)*n);
+  memset(file_events, 0, sizeof(FileEvent)*n);
 
   nevent = n;
   create_file_event(notify_receive_fd, EVENT_READABLE, EventCallbackRef(new C_handle_notify()));
@@ -80,28 +82,31 @@ EventCenter::~EventCenter()
 int EventCenter::create_file_event(int fd, int mask, EventCallbackRef ctxt)
 {
   int r;
-  if (file_events.size() > nevent) {
+  if (fd > nevent) {
     int new_size = nevent << 2;
+    while (fd > new_size)
+      new_size <<= 2;
     ldout(cct, 10) << __func__ << " event count exceed " << nevent << ", expand to " << new_size << dendl;
     r = driver->resize_events(new_size);
     if (r < 0) {
       lderr(cct) << __func__ << " event count is exceed." << dendl;
       return -ERANGE;
     }
+    FileEvent *new_events = (FileEvent *)realloc(file_events, sizeof(FileEvent)*new_size);
+    if (!new_events) {
+      lderr(cct) << __func__ << " failed to realloc file_events" << cpp_strerror(errno) << dendl;
+      return -errno;
+    }
+    file_events = new_events;
     nevent = new_size;
   }
 
   EventCenter::FileEvent *event = _get_file_event(fd);
 
-  r = driver->add_event(fd, event ? event->mask: EVENT_NONE, mask);
+  r = driver->add_event(fd, event->mask, mask);
   if (r < 0)
     return r;
 
-  if (!event) {
-    file_events[fd] = EventCenter::FileEvent();
-    event = &file_events[fd];
-  }
-
   event->mask |= mask;
   if (mask & EVENT_READABLE) {
     event->read_cb = ctxt;
@@ -117,7 +122,7 @@ int EventCenter::create_file_event(int fd, int mask, EventCallbackRef ctxt)
 void EventCenter::delete_file_event(int fd, int mask)
 {
   EventCenter::FileEvent *event = _get_file_event(fd);
-  if (!event)
+  if (!event->mask)
     return ;
 
   driver->del_event(fd, event->mask, mask);
@@ -130,8 +135,6 @@ void EventCenter::delete_file_event(int fd, int mask)
   }
 
   event->mask = event->mask & (~mask);
-  if (event->mask == EVENT_NONE)
-    file_events.erase(fd);
   ldout(cct, 10) << __func__ << " delete fd=" << fd << " mask=" << mask
                  << " now mask is " << event->mask << dendl;
 }
index 595613b85b6134894ff38272045bf12c0a1728db..3b3e66b54f5805f3a05f16227a44f7ee59986db0 100644 (file)
@@ -73,11 +73,11 @@ class EventCenter {
   };
 
   CephContext *cct;
-  uint64_t nevent;
+  int nevent;
   // Used only to external event
   Mutex lock;
   deque<EventCallbackRef> external_events;
-  unordered_map<int, FileEvent> file_events;
+  FileEvent *file_events;
   EventDriver *driver;
   map<utime_t, list<TimeEvent> > time_events;
   uint64_t time_event_next_id;
@@ -87,11 +87,10 @@ class EventCenter {
 
   int process_time_events();
   FileEvent *_get_file_event(int fd) {
-    unordered_map<int, FileEvent>::iterator it = file_events.find(fd);
-    if (it != file_events.end()) {
-      return &it->second;
-    }
-    return NULL;
+    FileEvent *p = &file_events[fd];
+    if (!p->mask)
+      new(p) FileEvent();
+    return p;
   }
 
  public: