static int util_wait_fd_run(struct fid_wait *wait_fid, int timeout) { struct util_wait_fd *wait; uint64_t start; void *ep_context[1]; int ret; wait = container_of(wait_fid, struct util_wait_fd, util_wait.wait_fid); start = (timeout >= 0) ? fi_gettime_ms() : 0; while (1) { ret = wait->util_wait.wait_try(&wait->util_wait); if (ret) return ret == -FI_EAGAIN ? 0 : ret; if (timeout >= 0) { timeout -= (int) (fi_gettime_ms() - start); if (timeout <= 0) return -FI_ETIMEDOUT; } ret = fi_epoll_wait(wait->epoll_fd, ep_context, 1, timeout); if (ret < 0) { FI_WARN(wait->util_wait.prov, FI_LOG_FABRIC, "poll failed\n"); return ret; } } }
static int util_wait_fd_run(struct fid_wait *wait_fid, int timeout) { struct util_wait_fd *wait; uint64_t start; void *context; int ret; wait = container_of(wait_fid, struct util_wait_fd, util_wait.wait_fid); start = (timeout >= 0) ? fi_gettime_ms() : 0; while (1) { fd_signal_reset(&wait->signal); ret = fi_poll(&wait->util_wait.pollset->poll_fid, &context, 1); if (ret > 0) return 0; else if (ret < 0) return ret; if (timeout >= 0) { timeout -= (int) (fi_gettime_ms() - start); if (timeout <= 0) return -FI_ETIMEDOUT; } context = fi_epoll_wait(wait->epoll_fd, timeout); } }
void tcpx_conn_mgr_run(struct util_eq *eq) { struct util_wait_fd *wait_fd; void *wait_contexts[MAX_EPOLL_EVENTS]; int num_fds = 0, i; assert(eq->wait != NULL); wait_fd = container_of(eq->wait, struct util_wait_fd, util_wait); num_fds = fi_epoll_wait(wait_fd->epoll_fd, wait_contexts, MAX_EPOLL_EVENTS, 0); if (num_fds < 0) return; for ( i = 0; i < num_fds; i++) { /* skip wake up signals */ if (&wait_fd->util_wait.wait_fid.fid == wait_contexts[i]) continue; process_cm_ctx(eq->wait, (struct tcpx_cm_context *) wait_contexts[i]); } }