summaryrefslogtreecommitdiff
path: root/uring.c
diff options
context:
space:
mode:
Diffstat (limited to 'uring.c')
-rw-r--r--uring.c22
1 files changed, 17 insertions, 5 deletions
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;
}