diff options
author | David Härdeman <david@hardeman.nu> | 2020-06-10 00:27:53 +0200 |
---|---|---|
committer | David Härdeman <david@hardeman.nu> | 2020-06-10 00:27:53 +0200 |
commit | 3ff6ac2e782cdfe1d32240556478a2b5a3b8c057 (patch) | |
tree | 21ffa7f76ea1f65f9d37dbefb644b40983dba61f /uring.c | |
parent | 09f1abfe18258807c412bce88ad459984add0cd3 (diff) |
Make server stop/start exec asynchronous
Diffstat (limited to 'uring.c')
-rw-r--r-- | uring.c | 37 |
1 files changed, 37 insertions, 0 deletions
@@ -257,6 +257,43 @@ uring_accept(struct cfg *cfg, struct uring_task *task, struct sockaddr_in46 *add } void +uring_poll(struct cfg *cfg, struct uring_task *task, short poll_mask, callback_t callback) +{ + struct io_uring_sqe *sqe = io_uring_get_sqe(&cfg->uev->uring); + + if (!sqe) + perrordie("io_uring_sqe"); + + if (task->fd < 0) { + error("uring_poll called with no fd set\n"); + return; + } + + uring_task_get(cfg, task); + task->callback = callback; + io_uring_prep_poll_add(sqe, task->fd, poll_mask); + io_uring_sqe_set_data(sqe, task); +} + +void +uring_poll_cancel(struct cfg *cfg, struct uring_task *task) +{ + struct io_uring_sqe *sqe = io_uring_get_sqe(&cfg->uev->uring); + + if (!sqe) + perrordie("io_uring_sqe"); + + if (task->fd < 0) { + error("uring_poll_cancel called with no fd set\n"); + return; + } + + task->dead = true; + io_uring_prep_poll_remove(sqe, task); + io_uring_sqe_set_data(sqe, NULL); +} + +void uring_cancel(struct cfg *cfg, struct uring_task *task) { struct io_uring_sqe *sqe = io_uring_get_sqe(&cfg->uev->uring); |