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