diff options
author | David Härdeman <david@hardeman.nu> | 2020-06-10 22:53:42 +0200 |
---|---|---|
committer | David Härdeman <david@hardeman.nu> | 2020-06-10 22:53:42 +0200 |
commit | fd80ac9b3ea3c6e213236e27ae8b73856d2a5158 (patch) | |
tree | 427ab05ca9d0e50099787d89aedb98a374f2d217 /uring.c | |
parent | 5e314fd0ebe500d3ba396a09c8984627beff2f37 (diff) |
Improve refcounting
Diffstat (limited to 'uring.c')
-rw-r--r-- | uring.c | 53 |
1 files changed, 41 insertions, 12 deletions
@@ -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) { @@ -471,6 +494,12 @@ uring_refdump(struct uring_ev *uev) } void +uring_delete(struct cfg *cfg) +{ + uring_task_put(cfg, &cfg->uev->task); +} + +void uring_init(struct cfg *cfg) { struct uring_ev *uev; |