]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
msg/async/kqueue: avoid remove nonexist kqueue event 9869/head
authorHaomai Wang <haomai@xsky.com>
Wed, 22 Jun 2016 14:34:28 +0000 (22:34 +0800)
committerHaomai Wang <haomai@xsky.com>
Wed, 17 Aug 2016 14:33:25 +0000 (22:33 +0800)
Signed-off-by: Haomai Wang <haomai@xsky.com>
src/msg/async/EventKqueue.cc

index d546462c2ed80f1c68253186eac45f3746d072bc..d013c059c85d80fb73a20a103c734f614e1a62bf 100644 (file)
@@ -48,14 +48,15 @@ int KqueueDriver::add_event(int fd, int cur_mask, int add_mask)
 {
   ldout(cct, 20) << __func__ << " add event fd=" << fd << " cur_mask=" << cur_mask
                  << "add_mask" << add_mask << dendl;
-  struct kevent ke;
-  int filter = 0;
-  filter |= (add_mask & EVENT_READABLE) ? EVFILT_READ : 0;
-  filter |= (add_mask & EVENT_WRITABLE) ? EVFILT_WRITE : 0;
-
-  if (filter) {
-    EV_SET(&ke, fd, filter, EV_ADD, 0, 0, NULL);
-    if (kevent(kqfd, &ke, 1, NULL, 0, NULL) == -1) {
+  struct kevent ke[2];
+  int num = 0;
+  if (add_mask & EVENT_READABLE)
+    EV_SET(&ke[num++], fd, EVFILT_READ, EV_ADD|EV_CLEAR, 0, 0, NULL);
+  if (add_mask & EVENT_WRITABLE)
+    EV_SET(&ke[num++], fd, EVFILT_WRITE, EV_ADD|EV_CLEAR, 0, 0, NULL);
+
+  if (num) {
+    if (kevent(kqfd, ke, num, NULL, 0, NULL) == -1) {
       lderr(cct) << __func__ << " unable to add event: "
                              << cpp_strerror(errno) << dendl;
       return -errno;
@@ -69,16 +70,18 @@ int KqueueDriver::del_event(int fd, int cur_mask, int delmask)
 {
   ldout(cct, 20) << __func__ << " del event fd=" << fd << " cur mask=" << cur_mask
                  << " delmask=" << delmask << dendl;
-  struct kevent ke;
-  int filter = 0;
-  filter |= (delmask & EVENT_READABLE) ? EVFILT_READ : 0;
-  filter |= (delmask & EVENT_WRITABLE) ? EVFILT_WRITE : 0;
-
-  if (filter) {
+  struct kevent ke[2];
+  int num = 0;
+  int mask = cur_mask & delmask;
+  if (mask & EVENT_READABLE)
+    EV_SET(&ke[num++], fd, EVFILT_READ, EV_DELETE, 0, 0, NULL);
+  if (mask & EVENT_WRITABLE)
+    EV_SET(&ke[num++], fd, EVFILT_WRITE, EV_DELETE, 0, 0, NULL);
+
+  if (num) {
     int r = 0;
-    EV_SET(&ke, fd, filter, EV_DELETE, 0, 0, NULL);
-    if ((r = kevent(kqfd, &ke, 1, NULL, 0, NULL)) < 0) {
-      lderr(cct) << __func__ << " kevent: delete fd=" << fd << " mask=" << filter
+    if ((r = kevent(kqfd, ke, num, NULL, 0, NULL)) < 0) {
+      lderr(cct) << __func__ << " kevent: delete fd=" << fd << " mask=" << mask
                  << " failed." << cpp_strerror(errno) << dendl;
       return -errno;
     }
@@ -115,6 +118,7 @@ int KqueueDriver::event_wait(vector<FiredFileEvent> &fired_events, struct timeva
 
       if (e->filter == EVFILT_READ) mask |= EVENT_READABLE;
       if (e->filter == EVFILT_WRITE) mask |= EVENT_WRITABLE;
+      if (e->flags & EV_ERROR) mask |= EVENT_READABLE|EVENT_WRITABLE;
       fired_events[j].fd = (int)e->ident;
       fired_events[j].mask = mask;