summaryrefslogtreecommitdiff
path: root/rcon.c
diff options
context:
space:
mode:
authorDavid Härdeman <david@hardeman.nu>2020-06-10 22:53:42 +0200
committerDavid Härdeman <david@hardeman.nu>2020-06-10 22:53:42 +0200
commitfd80ac9b3ea3c6e213236e27ae8b73856d2a5158 (patch)
tree427ab05ca9d0e50099787d89aedb98a374f2d217 /rcon.c
parent5e314fd0ebe500d3ba396a09c8984627beff2f37 (diff)
Improve refcounting
Diffstat (limited to 'rcon.c')
-rw-r--r--rcon.c29
1 files changed, 26 insertions, 3 deletions
diff --git a/rcon.c b/rcon.c
index be2f279..02fd021 100644
--- a/rcon.c
+++ b/rcon.c
@@ -52,9 +52,7 @@ rcon_delete(struct cfg *cfg, struct server *server)
return;
fprintf(stderr, "%s called, closing fd %i\n", __func__, rcon->task.fd);
- uring_cancel(cfg, &rcon->task);
- /* FIXME: Won't the refcount be wrong? */
- uring_task_put(cfg, &rcon->task);
+ uring_task_destroy(cfg, &rcon->task);
server->rcon = NULL;
}
@@ -213,6 +211,11 @@ rcon_stop_reply(struct cfg *cfg, struct uring_task *task, int res)
char *msg;
fprintf(stderr, "%s: result %i\n", __func__, res);
+ if (task->dead) {
+ fprintf(stderr, "%s: task dead\n", __func__);
+ return;
+ }
+
if (res < 0)
goto out;
@@ -237,6 +240,11 @@ rcon_stop_sent(struct cfg *cfg, struct uring_task *task, int res)
struct rcon *rcon = container_of(task, struct rcon, task);
fprintf(stderr, "%s: result %i\n", __func__, res);
+ if (task->dead) {
+ fprintf(stderr, "%s: task dead\n", __func__);
+ return;
+ }
+
if (res < 0) {
uring_task_put(cfg, &rcon->task);
return;
@@ -255,6 +263,11 @@ rcon_login_reply(struct cfg *cfg, struct uring_task *task, int res)
char *msg;
fprintf(stderr, "%s: result %i\n", __func__, res);
+ if (task->dead) {
+ fprintf(stderr, "%s: task dead\n", __func__);
+ return;
+ }
+
if (res < 0)
goto out;
@@ -286,6 +299,11 @@ rcon_login_sent(struct cfg *cfg, struct uring_task *task, int res)
struct rcon *rcon = container_of(task, struct rcon, task);
fprintf(stderr, "%s: result %i\n", __func__, res);
+ if (task->dead) {
+ fprintf(stderr, "%s: task dead\n", __func__);
+ return;
+ }
+
if (res < 0) {
uring_task_put(cfg, &rcon->task);
return;
@@ -303,6 +321,11 @@ rcon_connected(struct cfg *cfg, struct uring_task *task, int res)
struct rcon *rcon = container_of(task, struct rcon, task);
fprintf(stderr, "%s: connected %i\n", __func__, res);
+ if (task->dead) {
+ fprintf(stderr, "%s: task dead\n", __func__);
+ return;
+ }
+
if (res < 0) {
rcon_connect_next_rcon(cfg, rcon);
return;