From 571c8577a9d8b2c1716427681a0906e7f01eee48 Mon Sep 17 00:00:00 2001 From: Haomai Wang Date: Thu, 13 Nov 2014 15:10:05 +0800 Subject: [PATCH] AsyncMessenger: Fix select driver for add_event Signed-off-by: Haomai Wang --- src/msg/async/EventSelect.cc | 15 +++++++++------ src/test/msgr/test_async_driver.cc | 8 +++++++- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/msg/async/EventSelect.cc b/src/msg/async/EventSelect.cc index 9698dd1328e0..39d2c21594eb 100644 --- a/src/msg/async/EventSelect.cc +++ b/src/msg/async/EventSelect.cc @@ -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 &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; diff --git a/src/test/msgr/test_async_driver.cc b/src/test/msgr/test_async_driver.cc index b2beef758e29..d4ba95b53630 100644 --- a/src/test/msgr/test_async_driver.cc +++ b/src/test/msgr/test_async_driver.cc @@ -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); -- 2.47.3