diff --git a/src/aprsc.c b/src/aprsc.c index 12d0695..a95a94c 100644 --- a/src/aprsc.c +++ b/src/aprsc.c @@ -714,6 +714,7 @@ int main(int argc, char **argv) historydb_atend(); filter_wx_atend(); filter_entrycall_atend(); + status_atend(); hlog(LOG_NOTICE, "Shut down."); close_log(0); diff --git a/src/counterdata.c b/src/counterdata.c index f750542..673f2de 100644 --- a/src/counterdata.c +++ b/src/counterdata.c @@ -73,6 +73,16 @@ struct cdata_t *cdata_alloc(const char *name) return cd; } +extern void cdata_free(struct cdata_t *cd) +{ + if (cd->next) + cd->next->prevp = cd->prevp; + *cd->prevp = cd->next; + + hfree(cd->name); + hfree(cd); +} + struct cdata_t *cdata_find_and_lock(const char *name) { struct cdata_t *cd = NULL; diff --git a/src/counterdata.h b/src/counterdata.h index 8f60690..57d58e4 100644 --- a/src/counterdata.h +++ b/src/counterdata.h @@ -18,6 +18,7 @@ struct cdata_t; extern struct cdata_t *cdata_alloc(const char *name); +extern void cdata_free(struct cdata_t *cd); extern void cdata_counter_sample(struct cdata_t *cd, long long value); extern void cdata_gauge_sample(struct cdata_t *cd, long long value); extern long cdata_get_last_value(const char *name); diff --git a/src/status.c b/src/status.c index b914bf0..092da29 100644 --- a/src/status.c +++ b/src/status.c @@ -391,8 +391,21 @@ void status_init(void) cl->name = cdata_start[i][1]; cl->next = cdata_list; cl->cd = cdata_alloc(n); + hfree(n); cl->gauge = cdata_start[i][2][0] == 'g' ? 1 : 0; cdata_list = cl; i++; } } + +void status_atend(void) +{ + struct cdata_list_t *cl, *cl_next; + + for (cl = cdata_list; (cl); cl = cl_next) { + cl_next = cl->next; + cdata_free(cl->cd); + hfree(cl); + } +} + diff --git a/src/status.h b/src/status.h index 38dd976..f8c8447 100644 --- a/src/status.h +++ b/src/status.h @@ -19,5 +19,6 @@ extern char *status_json_string(int no_cache, int periodical); extern int status_dump_file(void); extern void status_init(void); +extern void status_atend(void); #endif