Track and clean up receive objects.
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user