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 -
- adding fd monitoring
- removing fd monitoring
- modify event (read / write) fd being monitored.
can provide me rough libev equivalent template above epoll code, highly appreciated.
Comments
Post a Comment