Track and clean up receive objects.

This commit is contained in:
Ian Gulliver
2016-02-23 12:08:53 -08:00
parent 77ee1422c1
commit ab6b8cd5e9
3 changed files with 26 additions and 4 deletions

View File

@@ -118,13 +118,14 @@ int main(int argc, char *argv[]) {
peer_loop(); peer_loop();
rand_cleanup(); receive_cleanup();
resolve_cleanup();
wakeup_cleanup();
send_cleanup(); send_cleanup();
incoming_cleanup(); incoming_cleanup();
outgoing_cleanup(); outgoing_cleanup();
rand_cleanup();
resolve_cleanup();
wakeup_cleanup();
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }

View File

@@ -25,7 +25,10 @@ struct receive {
char parser_state[PARSER_STATE_LEN]; char parser_state[PARSER_STATE_LEN];
parser_wrapper parser_wrapper; parser_wrapper parser_wrapper;
parser parser; parser parser;
struct receive *prev;
struct receive *next;
}; };
struct receive *receive_head = NULL;
struct parser { struct parser {
char *name; char *name;
@@ -67,6 +70,14 @@ static bool receive_autodetect_parse(struct receive *receive, struct packet *pac
static void receive_del(struct receive *receive) { static void receive_del(struct receive *receive) {
assert(!close(receive->peer.fd)); 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); 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) { void receive_new(int fd, void *unused) {
struct receive *receive = malloc(sizeof(*receive)); struct receive *receive = malloc(sizeof(*receive));
assert(receive); assert(receive);
@@ -101,6 +118,9 @@ void receive_new(int fd, void *unused) {
buf_init(&receive->buf); buf_init(&receive->buf);
memset(receive->parser_state, 0, PARSER_STATE_LEN); memset(receive->parser_state, 0, PARSER_STATE_LEN);
receive->parser_wrapper = receive_autodetect_parse; receive->parser_wrapper = receive_autodetect_parse;
receive->prev = NULL;
receive->next = receive_head;
receive_head = receive;
receive->peer.event_handler = receive_read; receive->peer.event_handler = receive_read;
peer_epoll_add((struct peer *) receive, EPOLLIN); peer_epoll_add((struct peer *) receive, EPOLLIN);

View File

@@ -4,5 +4,6 @@
#define PARSER_STATE_LEN 256 #define PARSER_STATE_LEN 256
void receive_cleanup();
void receive_new(int, void *); void receive_new(int, void *);
void receive_print_usage(); void receive_print_usage();