From f7804084f43403b1370851de9d459c49f55baa9a Mon Sep 17 00:00:00 2001 From: David Härdeman Date: Sat, 6 Jun 2020 14:19:26 +0200 Subject: Clean up the refcounting to allow a proper exit on signal --- uring.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) (limited to 'uring.c') diff --git a/uring.c b/uring.c index 3f089c8..20d8234 100644 --- a/uring.c +++ b/uring.c @@ -12,6 +12,7 @@ struct uring_ev { struct io_uring uring; struct io_uring_params uring_params; + struct cfg *cfg; struct uring_task task; }; @@ -271,7 +272,13 @@ uring_cancel(struct cfg *cfg, struct uring_task *task) static void uring_free(struct uring_task *task) { - fprintf(stderr, "%s called\n", __func__); + struct uring_ev *uev = container_of(task, struct uring_ev, task); + + fprintf(stderr, "%s: called\n", __func__); + + io_uring_queue_exit(&uev->uring); + uev->cfg->uev = NULL; + free(uev); } void @@ -296,9 +303,10 @@ uring_init(struct cfg *cfg) uring_task_init(&uev->task, "uev", &cfg->task, uring_free); cfg->uev = uev; + uev->cfg = cfg; } -int +void uring_event_loop(struct cfg *cfg) { while (true) { @@ -320,17 +328,21 @@ uring_event_loop(struct cfg *cfg) struct uring_task *task = io_uring_cqe_get_data(cqe); fprintf(stderr, "%s: got CEQ (res: %i, task: 0x%p, cb: 0x%p)\n", __func__, cqe->res, task, task ? task->callback : NULL); + if (task && task->callback) task->callback(cfg, task, cqe->res); - nr++; + if (task) uring_task_put(cfg, task); + + if (exiting) + return; + + nr++; } printf("%s: %u CQEs treated\n", __func__, nr); io_uring_cq_advance(&cfg->uev->uring, nr); } - - return 0; } -- cgit v1.2.3