diff options
author | David Härdeman <david@hardeman.nu> | 2020-06-06 14:19:26 +0200 |
---|---|---|
committer | David Härdeman <david@hardeman.nu> | 2020-06-06 14:19:26 +0200 |
commit | f7804084f43403b1370851de9d459c49f55baa9a (patch) | |
tree | 1e5c3760c52190f489fb5f4f2d79a0baf77d2685 /uring.c | |
parent | e2c3fd4f88b095aca492c0df1a278c774b00492d (diff) |
Clean up the refcounting to allow a proper exit on signal
Diffstat (limited to 'uring.c')
-rw-r--r-- | uring.c | 22 |
1 files changed, 17 insertions, 5 deletions
@@ -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; } |