static void epoll_become_multipoller(grpc_pollset *pollset, grpc_fd **fds, size_t nfds) { size_t i; pollset_hdr *h = gpr_malloc(sizeof(pollset_hdr)); struct epoll_event ev; int err; pollset->vtable = &multipoll_with_epoll_pollset; pollset->data.ptr = h; h->epoll_fd = epoll_create1(EPOLL_CLOEXEC); if (h->epoll_fd < 0) { /* TODO(klempner): Fall back to poll here, especially on ENOSYS */ gpr_log(GPR_ERROR, "epoll_create1 failed: %s", strerror(errno)); abort(); } for (i = 0; i < nfds; i++) { multipoll_with_epoll_pollset_add_fd(pollset, fds[i]); } grpc_wakeup_fd_create(&h->wakeup_fd); ev.events = EPOLLIN; ev.data.ptr = 0; err = epoll_ctl(h->epoll_fd, EPOLL_CTL_ADD, GRPC_WAKEUP_FD_GET_READ_FD(&h->wakeup_fd), &ev); if (err < 0) { gpr_log(GPR_ERROR, "Wakeup fd epoll_ctl failed: %s", strerror(errno)); abort(); } }
static void epoll_become_multipoller(grpc_pollset *pollset, grpc_fd **fds, size_t nfds) { size_t i; pollset_hdr *h = gpr_malloc(sizeof(pollset_hdr)); pollset->vtable = &multipoll_with_epoll_pollset; pollset->data.ptr = h; h->epoll_fd = epoll_create1(EPOLL_CLOEXEC); if (h->epoll_fd < 0) { /* TODO(klempner): Fall back to poll here, especially on ENOSYS */ gpr_log(GPR_ERROR, "epoll_create1 failed: %s", strerror(errno)); abort(); } for (i = 0; i < nfds; i++) { multipoll_with_epoll_pollset_add_fd(pollset, fds[i], 0); } }