From 2b2d6ad0541544074fd54c86af6de2e2947e62ce Mon Sep 17 00:00:00 2001 From: David Härdeman Date: Sun, 21 Jun 2020 23:42:05 +0200 Subject: Move mcast task to a per-server task to get refcounting right --- announce.c | 82 +++++++------------------------------------------------------- 1 file changed, 9 insertions(+), 73 deletions(-) (limited to 'announce.c') diff --git a/announce.c b/announce.c index 9195cd2..f85ba1e 100644 --- a/announce.c +++ b/announce.c @@ -4,6 +4,7 @@ #include #include #include +#include #include "main.h" #include "uring.h" @@ -13,76 +14,14 @@ struct announce { uint64_t value; struct uring_task task; - struct uring_task mcast_task; + int mcast_fd; }; -static void -mcast_free(struct uring_task *task) -{ - struct announce *aev = container_of(task, struct announce, mcast_task); - - assert_return(task); - debug(DBG_ANN, "task %p, aev %p", task, aev); -} - -static void -mcast_sent(struct cfg *cfg, struct uring_task *task, int res) -{ - struct server *server = container_of(task->tbuf, struct server, mcast_buf); - - assert_return(cfg && task && task->tbuf); - - if (res < 0) - error("failure %i", res); - else - debug(DBG_ANN, "result %i", res); - - uring_task_put(cfg, &server->task); -} - -static void -mcast_send(struct cfg *cfg, struct announce *aev, struct server *server) -{ - int len; - - assert_return(cfg && aev && server); - - /* FIXME: should these be assert:ed as well? */ - if (!server->pretty_name || server->announce_port < 1) - return; - - len = snprintf(server->mcast_buf.buf, sizeof(server->mcast_buf.buf), - "[MOTD]%s[/MOTD][AD]%" PRIu16 "[/AD]", - server->pretty_name, server->announce_port); - - if (len < 1 || len >= sizeof(server->mcast_buf.buf)) { - error("snprintf returned %i", len); - return; - } - - server->mcast_buf.len = len; - uring_task_set_buf(&aev->mcast_task, &server->mcast_buf); - uring_task_get(cfg, &server->task); - uring_tbuf_sendmsg(cfg, &aev->mcast_task, mcast_sent); -} - -static void -mcast_send_all(struct cfg *cfg, struct announce *aev) -{ - struct server *server; - - assert_return(cfg && aev); - - list_for_each_entry(server, &cfg->servers, list) { - verbose("Announcing server: %s", server->name); - mcast_send(cfg, aev, server); - } -} - static void announce_cb(struct cfg *cfg, struct uring_task *task, int res) { struct announce *aev = container_of(task, struct announce, task); + struct server *server; assert_return(cfg && task); assert_task_alive(DBG_ANN, task); @@ -93,7 +32,8 @@ announce_cb(struct cfg *cfg, struct uring_task *task, int res) } debug(DBG_ANN, "timerfd value %" PRIu64, aev->value); - mcast_send_all(cfg, aev); + list_for_each_entry(server, &cfg->servers, list) + server_announce(cfg, server, aev->mcast_fd); uring_read(cfg, &aev->task, &aev->value, sizeof(aev->value), announce_cb); } @@ -103,7 +43,9 @@ announce_free(struct uring_task *task) struct announce *aev = container_of(task, struct announce, task); assert_return(task); - debug(DBG_ANN, "task %p, aev 0x%p", task, aev); + debug(DBG_ANN, "task %p, aev 0x%p, mcast_fd: %i", + task, aev, aev->mcast_fd); + close(aev->mcast_fd); xfree(aev); } @@ -113,7 +55,6 @@ announce_refdump(struct announce *aev) assert_return_silent(aev); uring_task_refdump(&aev->task); - uring_task_refdump(&aev->mcast_task); } void @@ -122,7 +63,6 @@ announce_delete(struct cfg *cfg) assert_return(cfg && cfg->aev); debug(DBG_ANN, "closing fd %i", cfg->aev->task.fd); - uring_task_destroy(cfg, &cfg->aev->mcast_task); uring_task_destroy(cfg, &cfg->aev->task); cfg->aev = NULL; } @@ -190,11 +130,7 @@ announce_init(struct cfg *cfg) uring_task_init(cfg, &aev->task, "aev", uring_parent(cfg), announce_free); uring_task_set_fd(&aev->task, afd); - - uring_task_init(cfg, &aev->mcast_task, "aev_mcast", &aev->task, mcast_free); - uring_task_set_fd(&aev->mcast_task, sfd); - saddr_set_ipv4(&aev->mcast_task.saddr, cinet_addr(224,0,2,60), htons(4445)); - + aev->mcast_fd = sfd; cfg->aev = aev; uring_read(cfg, &aev->task, &aev->value, sizeof(aev->value), announce_cb); } -- cgit v1.2.3