static bool init_aio_linux(struct vfs_handle_struct *handle) { struct tevent_timer *te = NULL; if (event_fd != -1) { /* Already initialized. */ return true; } /* Schedule a shutdown event for 30 seconds from now. */ te = tevent_add_timer(handle->conn->sconn->ev_ctx, NULL, timeval_current_ofs(30, 0), aio_linux_housekeeping, NULL); if (te == NULL) { goto fail; } event_fd = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); if (event_fd == -1) { goto fail; } aio_read_event = tevent_add_fd(server_event_context(), NULL, event_fd, TEVENT_FD_READ, aio_linux_done, NULL); if (aio_read_event == NULL) { goto fail; } if (io_queue_init(lp_aio_max_threads(), &io_ctx)) { goto fail; } DEBUG(10,("init_aio_linux: initialized with up to %d events\n", (int)lp_aio_max_threads())); return true; fail: DEBUG(10,("init_aio_linux: initialization failed\n")); TALLOC_FREE(te); TALLOC_FREE(aio_read_event); if (event_fd != -1) { close(event_fd); event_fd = -1; } memset(&io_ctx, '\0', sizeof(io_ctx)); return false; }
static bool init_aio_threadpool(struct tevent_context *ev_ctx, struct pthreadpool_pipe **pp_pool, void (*completion_fn)(struct tevent_context *, struct tevent_fd *, uint16_t, void *)) { struct tevent_fd *sock_event = NULL; int ret = 0; if (*pp_pool) { return true; } ret = pthreadpool_pipe_init(lp_aio_max_threads(), pp_pool); if (ret) { errno = ret; return false; } sock_event = tevent_add_fd(ev_ctx, NULL, pthreadpool_pipe_signal_fd(*pp_pool), TEVENT_FD_READ, completion_fn, NULL); if (sock_event == NULL) { pthreadpool_pipe_destroy(*pp_pool); *pp_pool = NULL; return false; } DEBUG(10,("init_aio_threadpool: initialized with up to %d threads\n", (int)lp_aio_max_threads())); return true; }