]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
AsyncMessenger: Use unordered_map instead of map and remove unused codes
authorHaomai Wang <haomaiwang@gmail.com>
Wed, 17 Sep 2014 09:22:13 +0000 (17:22 +0800)
committerHaomai Wang <haomaiwang@gmail.com>
Wed, 8 Oct 2014 06:04:58 +0000 (14:04 +0800)
Signed-off-by: Haomai Wang <haomaiwang@gmail.com>
src/msg/Event.h
src/msg/EventEpoll.cc
src/msg/EventEpoll.h

index e9aad221482b2d448e42d59dcda78b98c1e46f7d..cc6aee454d01fe048c3f1dafa08ec23374ee5f0a 100644 (file)
@@ -86,7 +86,7 @@ class EventCenter {
   };
 
   Mutex lock;
-  map<int, FileEvent> file_events;
+  unordered_map<int, FileEvent> file_events;
   // The second element is id
   map<utime_t, uint64_t> time_to_ids;
   // The first element is id
@@ -104,7 +104,7 @@ class EventCenter {
 
   int process_time_events();
   FileEvent *_get_file_event(int fd) {
-    map<int, FileEvent>::iterator it = file_events.find(fd);
+    unordered_map<int, FileEvent>::iterator it = file_events.find(fd);
     if (it != file_events.end()) {
       return &it->second;
     }
@@ -118,7 +118,7 @@ class EventCenter {
     //
     deque<FiredEvent> conn_queue;
     // used only by file event <File Descriptor, Mask>
-    map<int, int> pending;
+    unordered_map<int, int> pending;
 
     EventWQ(EventCenter *c, time_t timeout, time_t suicide_timeout, ThreadPool *tp)
       : ThreadPool::WorkQueueVal<FiredEvent>("Event::EventWQ", timeout, suicide_timeout, tp), center(c) {}
@@ -126,7 +126,7 @@ class EventCenter {
     void _enqueue(FiredEvent e) {
       if (e.is_file) {
         // Ensure only one thread process one file descriptor
-        map<int, int>::iterator it = pending.find(e.file_event.fd);
+        unordered_map<int, int>::iterator it = pending.find(e.file_event.fd);
         if (it != pending.end()) {
           it->second |= e.file_event.mask;
         } else {
@@ -151,7 +151,6 @@ class EventCenter {
       FiredEvent e = conn_queue.front();
       conn_queue.pop_front();
       if (e.is_file) {
-        assert(pending.count(e.file_event.fd));
         e.file_event.mask = pending[e.file_event.fd];
         pending.erase(e.file_event.fd);
       }
@@ -180,7 +179,6 @@ class EventCenter {
       }
     }
     void _clear() {
-      assert(conn_queue.empty());
     }
   } event_wq;
 
index 68d0e1459fbe181c474e73c35887332907c75a2b..82215f7c8274fcc129bda8f8ebf027fee6018f4f 100644 (file)
@@ -23,6 +23,8 @@ int EpollDriver::init(int nevent)
     return -errno;
   }
 
+  size = nevent;
+
   return 0;
 }
 
@@ -31,21 +33,8 @@ int EpollDriver::add_event(int fd, int cur_mask, int add_mask)
   struct epoll_event ee;
   /* If the fd was already monitored for some event, we need a MOD
    * operation. Otherwise we need an ADD operation. */
-  int op, pos;
-  map<int, int>::iterator it = fds.find(fd);
-  if (it == fds.end()) {
-    op = EPOLL_CTL_ADD;
-    if (deleted_fds.size()) {
-      pos = deleted_fds.front();
-      deleted_fds.pop_front();
-    } else {
-      pos = next_pos;
-      next_pos++;
-    }
-    fds[fd] = pos;
-  } else {
-    op = cur_mask == EVENT_NONE ? EPOLL_CTL_ADD: EPOLL_CTL_MOD;
-  }
+  int op;
+  op = cur_mask == EVENT_NONE ? EPOLL_CTL_ADD: EPOLL_CTL_MOD;
 
   ee.events = EPOLLET;
   add_mask |= cur_mask; /* Merge old events */
@@ -69,10 +58,6 @@ int EpollDriver::add_event(int fd, int cur_mask, int add_mask)
 void EpollDriver::del_event(int fd, int cur_mask, int delmask)
 {
   struct epoll_event ee;
-  map<int, int>::iterator it = fds.find(fd);
-  if (it == fds.end())
-    return ;
-
   int mask = cur_mask & (~delmask);
 
   ee.events = 0;
@@ -92,12 +77,6 @@ void EpollDriver::del_event(int fd, int cur_mask, int delmask)
       lderr(cct) << __func__ << " epoll_ctl: delete fd=" << fd
                  << " failed." << cpp_strerror(errno) << dendl;
     }
-
-    if (next_pos == it->second)
-      next_pos--;
-    else
-      deleted_fds.push_back(it->second);
-    fds.erase(fd);
   }
   ldout(cct, 10) << __func__ << " del event fd=" << fd << " cur mask=" << mask
                  << dendl;
@@ -105,6 +84,7 @@ void EpollDriver::del_event(int fd, int cur_mask, int delmask)
 
 int EpollDriver::resize_events(int newsize)
 {
+  size = newsize;
   events = (struct epoll_event*)realloc(events, sizeof(struct epoll_event)*newsize);
   return 0;
 }
@@ -113,7 +93,7 @@ int EpollDriver::event_wait(vector<FiredFileEvent> &fired_events, struct timeval
 {
   int retval, numevents = 0;
 
-  retval = epoll_wait(epfd, events, next_pos,
+  retval = epoll_wait(epfd, events, size,
                       tvp ? (tvp->tv_sec*1000 + tvp->tv_usec/1000) : -1);
   if (retval > 0) {
     int j;
index 1927a62b987ae2106b4f4cbaf356e0c524f071c3..735accad1a3ae89a01211eb9584252f3529e0723 100644 (file)
 
 class EpollDriver : public EventDriver {
   int epfd;
-  // map "fd" to the pos of "events"
-  map<int, int> fds;
-  // used to store the deleted position
-  list<int> deleted_fds;
-  int next_pos;
   struct epoll_event *events;
   CephContext *cct;
+  int size;
 
  public:
-  EpollDriver(CephContext *c): epfd(-1), next_pos(0), events(NULL), cct(c) {}
+  EpollDriver(CephContext *c): epfd(-1), events(NULL), cct(c) {}
   virtual ~EpollDriver() {
     if (epfd != -1)
       close(epfd);