From: Haomai Wang Date: Wed, 17 Sep 2014 09:22:13 +0000 (+0800) Subject: AsyncMessenger: Use unordered_map instead of map and remove unused codes X-Git-Tag: v0.88~37^2~4^2~26 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=f7fd64dc285cdd8d4a923fc2eead4d512b9d22fc;p=ceph.git AsyncMessenger: Use unordered_map instead of map and remove unused codes Signed-off-by: Haomai Wang --- diff --git a/src/msg/Event.h b/src/msg/Event.h index e9aad221482b..cc6aee454d01 100644 --- a/src/msg/Event.h +++ b/src/msg/Event.h @@ -86,7 +86,7 @@ class EventCenter { }; Mutex lock; - map file_events; + unordered_map file_events; // The second element is id map 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::iterator it = file_events.find(fd); + unordered_map::iterator it = file_events.find(fd); if (it != file_events.end()) { return &it->second; } @@ -118,7 +118,7 @@ class EventCenter { // deque conn_queue; // used only by file event - map pending; + unordered_map pending; EventWQ(EventCenter *c, time_t timeout, time_t suicide_timeout, ThreadPool *tp) : ThreadPool::WorkQueueVal("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::iterator it = pending.find(e.file_event.fd); + unordered_map::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; diff --git a/src/msg/EventEpoll.cc b/src/msg/EventEpoll.cc index 68d0e1459fbe..82215f7c8274 100644 --- a/src/msg/EventEpoll.cc +++ b/src/msg/EventEpoll.cc @@ -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::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::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 &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; diff --git a/src/msg/EventEpoll.h b/src/msg/EventEpoll.h index 1927a62b987a..735accad1a3a 100644 --- a/src/msg/EventEpoll.h +++ b/src/msg/EventEpoll.h @@ -10,16 +10,12 @@ class EpollDriver : public EventDriver { int epfd; - // map "fd" to the pos of "events" - map fds; - // used to store the deleted position - list 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);