From: Haomai Wang Date: Sat, 27 Sep 2014 15:33:47 +0000 (+0800) Subject: Event: Use array instead of unordered_map for file_events X-Git-Tag: v0.88~37^2~4^2~15 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=0caad0d7b3198a4054cc76177ec9a5cc9c7bea3d;p=ceph.git Event: Use array instead of unordered_map for file_events Signed-off-by: Haomai Wang --- diff --git a/src/msg/Event.cc b/src/msg/Event.cc index a5c6314345f6..2aa99bc397f1 100644 --- a/src/msg/Event.cc +++ b/src/msg/Event.cc @@ -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; } diff --git a/src/msg/Event.h b/src/msg/Event.h index 595613b85b61..3b3e66b54f58 100644 --- a/src/msg/Event.h +++ b/src/msg/Event.h @@ -73,11 +73,11 @@ class EventCenter { }; CephContext *cct; - uint64_t nevent; + int nevent; // Used only to external event Mutex lock; deque external_events; - unordered_map file_events; + FileEvent *file_events; EventDriver *driver; map > 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::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: