[libevent]epoll_add()

来源:互联网 发布:手机出钱魔术软件 编辑:程序博客网 时间:2024/05/18 02:56
static intepoll_add(void *arg, struct event *ev){struct epollop *epollop = arg;struct epoll_event epev = {0, {0}};struct evepoll *evep;int fd, op, events;if (ev->ev_events & EV_SIGNAL)//信号事件并不用epoll_ctl注册return (evsignal_add(ev));fd = ev->ev_fd;if (fd >= epollop->nfds) {//重新分配空间/* Extent the file descriptor array as necessary */if (epoll_recalc(ev->ev_base, epollop, fd) == -1)return (-1);}evep = &epollop->fds[fd];//准备获得该文件描述符对应的event,其实就是ev了,下面根据是否为NULL来判断是新增还是修改来执行epoll_ctl()op = EPOLL_CTL_ADD;events = 0;if (evep->evread != NULL) {events |= EPOLLIN;op = EPOLL_CTL_MOD;}if (evep->evwrite != NULL) {events |= EPOLLOUT;op = EPOLL_CTL_MOD;}if (ev->ev_events & EV_READ)events |= EPOLLIN;if (ev->ev_events & EV_WRITE)events |= EPOLLOUT;epev.data.fd = fd;epev.events = events;if (epoll_ctl(epollop->epfd, op, ev->ev_fd, &epev) == -1)//注册return (-1);/* Update events responsible */if (ev->ev_events & EV_READ//一个读写event要对应一个evepoll,为什么还要用这个结构来存,因为用epoll_wait获得的是文件描述符evep->evread = ev;//用文件描述符来寻找event最好就是用下标来找,用下标找到evepoll再找到event,进行相应操作if (ev->ev_events & EV_WRITE)evep->evwrite = ev;return (0);}

0 0