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;
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;
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);
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);
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)
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);