]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
AsyncMessenger: Fix select driver for add_event 2909/head
authorHaomai Wang <haomaiwang@gmail.com>
Thu, 13 Nov 2014 07:10:05 +0000 (15:10 +0800)
committerHaomai Wang <haomaiwang@gmail.com>
Thu, 13 Nov 2014 07:36:05 +0000 (15:36 +0800)
Signed-off-by: Haomai Wang <haomaiwang@gmail.com>
src/msg/async/EventSelect.cc
src/test/msgr/test_async_driver.cc

index 9698dd1328e057fc8a174df35d1588e64c55bcf6..39d2c21594ebc4a1be4390e7afc40f9dd4ab919b 100644 (file)
@@ -37,9 +37,10 @@ int SelectDriver::add_event(int fd, int cur_mask, int add_mask)
   ldout(cct, 10) << __func__ << " add event to fd=" << fd << " mask=" << add_mask
                  << dendl;
 
-  if (add_mask & EVENT_READABLE)
+  int mask = cur_mask | add_mask;
+  if (mask & EVENT_READABLE)
     FD_SET(fd, &rfds);
-  if (add_mask & EVENT_WRITABLE)
+  if (mask & EVENT_WRITABLE)
     FD_SET(fd, &wfds);
   if (fd > max_fd)
       max_fd = fd;
@@ -79,10 +80,12 @@ int SelectDriver::event_wait(vector<FiredFileEvent> &fired_events, struct timeva
           mask |= EVENT_READABLE;
       if (FD_ISSET(j, &_wfds))
           mask |= EVENT_WRITABLE;
-      fe.fd = j;
-      fe.mask = mask;
-      fired_events.push_back(fe);
-      numevents++;
+      if (mask) {
+        fe.fd = j;
+        fe.mask = mask;
+        fired_events.push_back(fe);
+        numevents++;
+      }
     }
   }
   return numevents;
index b2beef758e29b3d2fd9938e0e6df53e74c514880..d4ba95b53630004cd7d1bfa737c2afa0d907558e 100644 (file)
@@ -120,12 +120,14 @@ TEST_P(EventDriverTest, PipeTest) {
   ASSERT_EQ(fired_events[0].fd, fds[0]);
 
 
+  fired_events.clear();
   r = write(fds[1], &c, sizeof(c));
   ASSERT_EQ(r, 1);
   r = driver->event_wait(fired_events, &tv);
   ASSERT_EQ(r, 1);
   ASSERT_EQ(fired_events[0].fd, fds[0]);
 
+  fired_events.clear();
   driver->del_event(fds[0], EVENT_READABLE, EVENT_READABLE);
   r = write(fds[1], &c, sizeof(c));
   ASSERT_EQ(r, 1);
@@ -193,6 +195,7 @@ TEST_P(EventDriverTest, NetworkSocketTest) {
   r = driver->event_wait(fired_events, &tv);
   ASSERT_EQ(r, 0);
 
+  fired_events.clear();
   pthread_t thread1;
   r = pthread_create(&thread1, NULL, echoclient, (void*)port);
   ASSERT_EQ(r, 0);
@@ -202,18 +205,21 @@ TEST_P(EventDriverTest, NetworkSocketTest) {
   ASSERT_EQ(r, 1);
   ASSERT_EQ(fired_events[0].fd, listen_sd);
 
+  fired_events.clear();
   int client_sd = ::accept(listen_sd, NULL, NULL);
   ASSERT_TRUE(client_sd > 0);
   r = driver->add_event(client_sd, EVENT_NONE, EVENT_READABLE);
   ASSERT_EQ(r, 0);
 
   do {
+    fired_events.clear();
     tv.tv_sec = 5;
     tv.tv_usec = 0;
     r = driver->event_wait(fired_events, &tv);
     ASSERT_EQ(r, 1);
     ASSERT_EQ(fired_events[0].mask, EVENT_READABLE);
 
+    fired_events.clear();
     char data[100];
     r = ::read(client_sd, data, sizeof(data));
     if (r == 0)
@@ -226,7 +232,7 @@ TEST_P(EventDriverTest, NetworkSocketTest) {
     r = write(client_sd, data, strlen(data));
     ASSERT_EQ(r, strlen(data));
     driver->del_event(client_sd, EVENT_READABLE|EVENT_WRITABLE,
-                      EVENT_READABLE|EVENT_WRITABLE);
+                      EVENT_WRITABLE);
   } while (1);
 
   ::close(client_sd);