ST_HIDDEN int _st_epoll_pollset_add(struct pollfd *pds, int npds) { struct epoll_event ev; int i, fd; int old_events, events, op; /* Do as many checks as possible up front */ for (i = 0; i < npds; i++) { fd = pds[i].fd; if (fd < 0 || !pds[i].events || (pds[i].events & ~(POLLIN | POLLOUT | POLLPRI))) { errno = EINVAL; return -1; } if (fd >= _st_epoll_data->fd_data_size && _st_epoll_fd_data_expand(fd) < 0) { return -1; } } for (i = 0; i < npds; i++) { fd = pds[i].fd; old_events = _ST_EPOLL_EVENTS(fd); if (pds[i].events & POLLIN) { _ST_EPOLL_READ_CNT(fd)++; } if (pds[i].events & POLLOUT) { _ST_EPOLL_WRITE_CNT(fd)++; } if (pds[i].events & POLLPRI) { _ST_EPOLL_EXCEP_CNT(fd)++; } events = _ST_EPOLL_EVENTS(fd); if (events != old_events) { op = old_events ? EPOLL_CTL_MOD : EPOLL_CTL_ADD; ev.events = events; ev.data.fd = fd; if (epoll_ctl(_st_epoll_data->epfd, op, fd, &ev) < 0 && (op != EPOLL_CTL_ADD || errno != EEXIST)) { break; } if (op == EPOLL_CTL_ADD) { _st_epoll_data->evtlist_cnt++; if (_st_epoll_data->evtlist_cnt > _st_epoll_data->evtlist_size) { _st_epoll_evtlist_expand(); } } } } if (i < npds) { /* Error */ int err = errno; /* Unroll the state */ _st_epoll_pollset_del(pds, i + 1); errno = err; return -1; } return 0; }
ST_HIDDEN int _st_epoll_fd_new(int osfd) { if (osfd >= _st_epoll_data->fd_data_size && _st_epoll_fd_data_expand(osfd) < 0) return -1; return 0; }
// 这里只是判断下需不需要扩容? ST_HIDDEN int _st_epoll_fd_new(int osfd) { // 这里简单通过文件描述符的值判断当前打开的描述符数量(由于新打开的文件描述符值是依次递增的) if (osfd >= _st_epoll_data->fd_data_size && _st_epoll_fd_data_expand(osfd) < 0) return -1; return 0; }