From ab6b8cd5e9157f832f590720e002016fd17bcc82 Mon Sep 17 00:00:00 2001 From: Ian Gulliver Date: Tue, 23 Feb 2016 12:08:53 -0800 Subject: [PATCH] Track and clean up receive objects. --- adsbus/adsbus.c | 9 +++++---- adsbus/receive.c | 20 ++++++++++++++++++++ adsbus/receive.h | 1 + 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/adsbus/adsbus.c b/adsbus/adsbus.c index 4b12b0a..b6900be 100644 --- a/adsbus/adsbus.c +++ b/adsbus/adsbus.c @@ -118,13 +118,14 @@ int main(int argc, char *argv[]) { peer_loop(); - rand_cleanup(); - resolve_cleanup(); - wakeup_cleanup(); + receive_cleanup(); send_cleanup(); - incoming_cleanup(); outgoing_cleanup(); + rand_cleanup(); + resolve_cleanup(); + wakeup_cleanup(); + return EXIT_SUCCESS; } diff --git a/adsbus/receive.c b/adsbus/receive.c index 620311c..d135309 100644 --- a/adsbus/receive.c +++ b/adsbus/receive.c @@ -25,7 +25,10 @@ struct receive { char parser_state[PARSER_STATE_LEN]; parser_wrapper parser_wrapper; parser parser; + struct receive *prev; + struct receive *next; }; +struct receive *receive_head = NULL; struct parser { char *name; @@ -67,6 +70,14 @@ static bool receive_autodetect_parse(struct receive *receive, struct packet *pac static void receive_del(struct receive *receive) { assert(!close(receive->peer.fd)); + if (receive->prev) { + receive->prev->next = receive->next; + } else { + receive_head = receive->next; + } + if (receive->next) { + receive->next->prev = receive->prev; + } free(receive); } @@ -93,6 +104,12 @@ static void receive_read(struct peer *peer) { } } +void receive_cleanup() { + while (receive_head) { + receive_del(receive_head); + } +} + void receive_new(int fd, void *unused) { struct receive *receive = malloc(sizeof(*receive)); assert(receive); @@ -101,6 +118,9 @@ void receive_new(int fd, void *unused) { buf_init(&receive->buf); memset(receive->parser_state, 0, PARSER_STATE_LEN); receive->parser_wrapper = receive_autodetect_parse; + receive->prev = NULL; + receive->next = receive_head; + receive_head = receive; receive->peer.event_handler = receive_read; peer_epoll_add((struct peer *) receive, EPOLLIN); diff --git a/adsbus/receive.h b/adsbus/receive.h index 8b6d492..236a340 100644 --- a/adsbus/receive.h +++ b/adsbus/receive.h @@ -4,5 +4,6 @@ #define PARSER_STATE_LEN 256 +void receive_cleanup(); void receive_new(int, void *); void receive_print_usage();