src/server/daemon/event_linux.c

changeset 704
778dcf4ad63c
parent 617
01228719b3ce
equal deleted inserted replaced
703:395c62fac7e5 704:778dcf4ad63c
276 free(queue); 276 free(queue);
277 queue = next; 277 queue = next;
278 } 278 }
279 } 279 }
280 280
281 int ev_convert2sys_events(int events) { 281 uint32_t ev_convert2sys_events(int events) {
282 int e = EPOLLET; 282 uint32_t e = EPOLLET | EPOLLRDHUP;
283 if((events & EVENT_POLLIN) == EVENT_POLLIN) { 283 if((events & EVENT_POLLIN) == EVENT_POLLIN) {
284 e |= EPOLLIN; 284 e |= EPOLLIN;
285 } 285 }
286 if((events & EVENT_POLLOUT) == EVENT_POLLOUT) { 286 if((events & EVENT_POLLOUT) == EVENT_POLLOUT) {
287 e |= EPOLLOUT; 287 e |= EPOLLOUT;
303 EventHandlerLinux *ev = (EventHandlerLinux*)h; 303 EventHandlerLinux *ev = (EventHandlerLinux*)h;
304 event->object = (intptr_t)fd; 304 event->object = (intptr_t)fd;
305 event->events = EVENT_POLLOUT; 305 event->events = EVENT_POLLOUT;
306 struct epoll_event epev; 306 struct epoll_event epev;
307 epev.events = EPOLLOUT | EPOLLRDHUP | EPOLLET; // input event, edge triggered 307 epev.events = EPOLLOUT | EPOLLRDHUP | EPOLLET; // input event, edge triggered
308 epev.data.ptr = event;
309 return epoll_ctl(ev->ep, EPOLL_CTL_ADD, fd, &epev);
310 }
311
312 int ev_poll(EventHandler *h, int fd, Event *event) {
313 EventHandlerLinux *ev = (EventHandlerLinux*)h;
314 event->object = (intptr_t)fd;
315 struct epoll_event epev;
316 epev.events = ev_convert2sys_events(event->events);
308 epev.data.ptr = event; 317 epev.data.ptr = event;
309 return epoll_ctl(ev->ep, EPOLL_CTL_ADD, fd, &epev); 318 return epoll_ctl(ev->ep, EPOLL_CTL_ADD, fd, &epev);
310 } 319 }
311 320
312 int ev_remove_poll(EventHandler *h, int fd) { 321 int ev_remove_poll(EventHandler *h, int fd) {

mercurial