io - Porting from poll/epoll to Libev -


i new libev , having hard time understanding it. have used select(), poll() , epoll() before , easy understand , implement. want switch epoll libev. here doing epoll -

short int state[10000];       // stores events fd state[fd] |= current_state    // update state fd, current_state either epollin or epollout not both /* attempt add fd epoll monitoring. if fd exists, modify events */ ev.events = state[fd];     ev.data.fd = fd; epollctl = epoll_ctl(epollfd, epoll_ctl_add, fd, &ev);  if(epollctl == -1 && errno == eexist)   epollctl = epoll_ctl(epollfd, epoll_ctl_mod, fd, &ev); while(1) {   num = epoll_wait (epollfd, events, 100000 , -1);   for(i = 0, < num, ++i)   {     /* process read , tell epoll not notify anymore read events given fd */     if(events[i].events & epollin)     {             process_read (m, m->read, events[i].data.fd );       state[events[i].data.fd] &= ~(epollin)                ev.events = state[events[i].data.fd]       ev.data.fd = events[i].data.fd;       epollctl = epoll_ctl(epollfd, epoll_ctl_mod, events[i].data.fd, &ev);     }     /* process write , tell epoll not notify anymore write events given fd */     if(events[i].events & epollout)     {       process_write (m, m->write, events[i].data.fd );       state[events[i].data.fd] &= ~(epollout)                ev.events = state[events[i].data.fd]        ev.data.fd = events[i].data.fd;       epollctl = epoll_ctl(epollfd, epoll_ctl_mod, events[i].data.fd, &ev);     }     /* remove fd epoll on error */     if(events[i].events & epollerr)       epollctl = epoll_ctl(epollfd, epoll_ctl_del, events[i].data.fd, &ev);   } } 

this not complete code, have purposely omitted error checks , other non-relevant stuff while posting here can concentrate on logic. looking libev equivalent method achieve following -

  1. adding fd monitoring
  2. removing fd monitoring
  3. modify event (read / write) fd being monitored.

can provide me rough libev equivalent template above epoll code, highly appreciated.


Comments