From f7804084f43403b1370851de9d459c49f55baa9a Mon Sep 17 00:00:00 2001 From: David Härdeman Date: Sat, 6 Jun 2020 14:19:26 +0200 Subject: Clean up the refcounting to allow a proper exit on signal --- main.c | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) (limited to 'main.c') diff --git a/main.c b/main.c index 1fc0e5d..398a998 100644 --- a/main.c +++ b/main.c @@ -22,6 +22,10 @@ int debuglvl = 0; +bool exiting = false; + +struct cfg *cfghack = NULL; + void debug(unsigned lvl, const char *fmt, ...) { @@ -57,8 +61,10 @@ cfg_free(struct uring_task *task) { struct cfg *cfg = container_of(task, struct cfg, task); + fprintf(stderr, "%s: called\n", __func__); free(cfg); - exit(EXIT_SUCCESS); + fprintf(stderr, "All resources free, exiting\n"); + exiting = true; } static void @@ -134,6 +140,7 @@ cfg_init(int argc, char **argv) struct signalfd_ev { struct uring_task task; //struct signalfd_siginfo buf; + struct cfg *cfg; uint64_t buf; }; @@ -142,7 +149,8 @@ signalfd_free(struct uring_task *task) { struct signalfd_ev *sev = container_of(task, struct signalfd_ev, task); - debug(2, "Freeing signalfd\n"); + fprintf(stderr, "%s: called\n", __func__); + sev->cfg->sev = NULL; free(sev); } @@ -156,7 +164,8 @@ dump_tree(struct cfg *cfg) fprintf(stderr, "============\n"); uring_task_refdump(&cfg->task); uring_refdump(cfg->uev); - uring_task_refdump(&cfg->sev->task); + if (cfg->sev) + uring_task_refdump(&cfg->sev->task); announce_refdump(cfg->aev); if (cfg->iev) cfgdir_refdump(cfg->iev); @@ -190,7 +199,9 @@ signalfd_read(struct cfg *cfg, struct uring_task *task, int res) cfgdir_delete(cfg); list_for_each_entry_safe(server, stmp, &cfg->servers, list) server_delete(cfg, server); - uring_read(cfg, &sev->task, &sev->buf, sizeof(sev->buf), 0, signalfd_read); + fprintf(stderr, "%s: putting sev task 0x%p\n", __func__, &sev->task); + uring_task_put(cfg, &sev->task); + //uring_read(cfg, &sev->task, &sev->buf, sizeof(sev->buf), 0, signalfd_read); } } @@ -200,11 +211,14 @@ static void hack_handler(int signum) { uint64_t val; + static int count = 0; switch (signum) { case SIGINT: fprintf(stderr, "Got a SIGINT\n"); val = 1000; + if (count > 3) + dump_tree(cfghack); break; case SIGHUP: fprintf(stderr, "Got a SIGHUP\n"); @@ -221,6 +235,7 @@ hack_handler(int signum) } write(hack_efd, &val, sizeof(val)); + count++; } static void @@ -264,6 +279,7 @@ signalfd_init(struct cfg *cfg) uring_task_init(&sev->task, "sev", uring_parent(cfg), signalfd_free); uring_task_set_fd(&sev->task, sfd); cfg->sev = sev; + sev->cfg = cfg; hack_efd = sfd; uring_read(cfg, &sev->task, &sev->buf, sizeof(sev->buf), 0, signalfd_read); } @@ -275,6 +291,8 @@ main(int argc, char **argv) cfg = cfg_init(argc, argv); + cfghack = cfg; + cfg_read(cfg); uring_init(cfg); @@ -287,7 +305,11 @@ main(int argc, char **argv) announce_start(cfg->aev); + uring_task_put(cfg, &cfg->task); + uring_event_loop(cfg); + fprintf(stderr, "Event loop exited\n"); + exit(EXIT_SUCCESS); } -- cgit v1.2.3