From fd80ac9b3ea3c6e213236e27ae8b73856d2a5158 Mon Sep 17 00:00:00 2001 From: David Härdeman Date: Wed, 10 Jun 2020 22:53:42 +0200 Subject: Improve refcounting --- uring.c | 53 +++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 41 insertions(+), 12 deletions(-) (limited to 'uring.c') diff --git a/uring.c b/uring.c index 347c7fc..26e2073 100644 --- a/uring.c +++ b/uring.c @@ -64,6 +64,32 @@ uring_task_refdump(struct uring_task *task) task->refcount); } +static void +uring_cancel(struct cfg *cfg, struct uring_task *task) +{ + struct io_uring_sqe *sqe = get_sqe(cfg); + + io_uring_prep_cancel(sqe, task, 0); + io_uring_sqe_set_data(sqe, NULL); +} + +/* + * Similar to uring_task_put, but can be called from other tasks + * while the task is active. + */ +void +uring_task_destroy(struct cfg *cfg, struct uring_task *task) +{ + fprintf(stderr, "%s: called with task %s (%p), fd %i and refcount %u\n", + __func__, task->name, task, task->fd, task->refcount); + + if (task->fd >= 0) + uring_cancel(cfg, task); + + task->dead = true; + uring_task_put(cfg, task); +} + void uring_task_put(struct cfg *cfg, struct uring_task *task) { @@ -85,6 +111,10 @@ uring_task_put(struct cfg *cfg, struct uring_task *task) return; } + if (parent) + fprintf(stderr, "%s: task %s (%p) putting parent %s (%p)\n", + __func__, task->name, task, task->parent->name, task->parent); + if (task->free) task->free(task); @@ -163,8 +193,11 @@ uring_task_init(struct uring_task *task, const char *name, task->name = name; task->tbuf = NULL; - if (task->parent) + if (task->parent) { + fprintf(stderr, "%s: task %s (%p) getting parent %s (%p)\n", + __func__, task->name, task, task->parent->name, task->parent); uring_task_get(NULL, task->parent); + } } void @@ -432,7 +465,7 @@ uring_poll_cancel(struct cfg *cfg, struct uring_task *task) struct io_uring_sqe *sqe; if (task->fd < 0) { - error("uring_poll_cancel called with no fd set\n"); + fprintf(stderr, "uring_poll_cancel called with no fd set\n"); return; } @@ -442,16 +475,6 @@ uring_poll_cancel(struct cfg *cfg, struct uring_task *task) io_uring_sqe_set_data(sqe, NULL); } -void -uring_cancel(struct cfg *cfg, struct uring_task *task) -{ - struct io_uring_sqe *sqe = get_sqe(cfg); - - task->dead = true; - io_uring_prep_cancel(sqe, task, 0); - io_uring_sqe_set_data(sqe, NULL); -} - static void uring_free(struct uring_task *task) { @@ -470,6 +493,12 @@ uring_refdump(struct uring_ev *uev) uring_task_refdump(&uev->task); } +void +uring_delete(struct cfg *cfg) +{ + uring_task_put(cfg, &cfg->uev->task); +} + void uring_init(struct cfg *cfg) { -- cgit v1.2.3