return 0;
r = driver->add_event(fd, event->mask, mask);
- if (r < 0)
+ if (r < 0) {
+ // Actually we don't allow any failed error code, caller doesn't prepare to
+ // handle error status. So now we need to assert failure here. In practice,
+ // add_event shouldn't report error, otherwise it must be a innermost bug!
+ assert(0 == "BUG!");
return r;
+ }
event->mask |= mask;
if (mask & EVENT_READABLE) {
if (!event->mask)
return ;
- driver->del_event(fd, event->mask, mask);
+ int r = driver->del_event(fd, event->mask, mask);
+ if (r < 0) {
+ // see create_file_event
+ assert(0 == "BUG!");
+ }
if (mask & EVENT_READABLE && event->read_cb) {
event->read_cb.reset();
virtual ~EventDriver() {} // we want a virtual destructor!!!
virtual int init(int nevent) = 0;
virtual int add_event(int fd, int cur_mask, int mask) = 0;
- virtual void del_event(int fd, int cur_mask, int del_mask) = 0;
+ virtual int del_event(int fd, int cur_mask, int del_mask) = 0;
virtual int event_wait(vector<FiredFileEvent> &fired_events, struct timeval *tp) = 0;
virtual int resize_events(int newsize) = 0;
};
return 0;
}
-void EpollDriver::del_event(int fd, int cur_mask, int delmask)
+int EpollDriver::del_event(int fd, int cur_mask, int delmask)
{
ldout(cct, 20) << __func__ << " del event fd=" << fd << " cur_mask=" << cur_mask
<< " delmask=" << delmask << " to " << epfd << dendl;
struct epoll_event ee;
int mask = cur_mask & (~delmask);
+ int r = 0;
ee.events = 0;
if (mask & EVENT_READABLE) ee.events |= EPOLLIN;
ee.data.u64 = 0; /* avoid valgrind warning */
ee.data.fd = fd;
if (mask != EVENT_NONE) {
- if (epoll_ctl(epfd, EPOLL_CTL_MOD, fd, &ee) < 0) {
+ if ((r = epoll_ctl(epfd, EPOLL_CTL_MOD, fd, &ee)) < 0) {
lderr(cct) << __func__ << " epoll_ctl: modify fd=" << fd << " mask=" << mask
<< " failed." << cpp_strerror(errno) << dendl;
+ return r;
}
} else {
/* Note, Kernel < 2.6.9 requires a non null event pointer even for
* EPOLL_CTL_DEL. */
- if (epoll_ctl(epfd, EPOLL_CTL_DEL, fd, &ee) < 0) {
+ if ((r = epoll_ctl(epfd, EPOLL_CTL_DEL, fd, &ee)) < 0) {
lderr(cct) << __func__ << " epoll_ctl: delete fd=" << fd
<< " failed." << cpp_strerror(errno) << dendl;
+ return r;
}
}
+ return 0;
}
int EpollDriver::resize_events(int newsize)
int init(int nevent);
int add_event(int fd, int cur_mask, int add_mask);
- void del_event(int fd, int cur_mask, int del_mask);
+ int del_event(int fd, int cur_mask, int del_mask);
int resize_events(int newsize);
int event_wait(vector<FiredFileEvent> &fired_events, struct timeval *tp);
};
return 0;
}
-void KqueueDriver::del_event(int fd, int cur_mask, int delmask)
+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 ee;
struct kevent ke;
int filter = 0;
+ int r = 0;
filter |= (delmask & EVENT_READABLE) ? EVFILT_READ : 0;
filter |= (delmask & EVENT_WRITABLE) ? EVFILT_WRITE : 0;
if (filter) {
EV_SET(&ke, fd, filter, EV_DELETE, 0, 0, NULL);
- if (kevent(kqfd, &ke, 1, NULL, 0, NULL) < 0) {
+ if ((r = kevent(kqfd, &ke, 1, NULL, 0, NULL)) < 0) {
lderr(cct) << __func__ << " kevent: delete fd=" << fd << " mask=" << filter
<< " failed." << cpp_strerror(errno) << dendl;
+ return r;
}
}
+ return 0;
}
int KqueueDriver::resize_events(int newsize)
int init(int nevent);
int add_event(int fd, int cur_mask, int add_mask);
- void del_event(int fd, int cur_mask, int del_mask);
+ int del_event(int fd, int cur_mask, int del_mask);
int resize_events(int newsize);
int event_wait(vector<FiredFileEvent> &fired_events, struct timeval *tp);
};
return 0;
}
-void SelectDriver::del_event(int fd, int cur_mask, int delmask)
+int SelectDriver::del_event(int fd, int cur_mask, int delmask)
{
ldout(cct, 10) << __func__ << " del event fd=" << fd << " cur mask=" << cur_mask
<< dendl;
FD_CLR(fd, &rfds);
if (delmask & EVENT_WRITABLE)
FD_CLR(fd, &wfds);
+ return 0;
}
int SelectDriver::resize_events(int newsize)
int init(int nevent);
int add_event(int fd, int cur_mask, int add_mask);
- void del_event(int fd, int cur_mask, int del_mask);
+ int del_event(int fd, int cur_mask, int del_mask);
int resize_events(int newsize);
int event_wait(vector<FiredFileEvent> &fired_events, struct timeval *tp);
};