Garbage collector allows to register variables which then all will be freed by calling gc_free(). --- src/common.c | 34 ++++++++++++++++++++++++++++++++++ src/common.h | 20 ++++++++++++++++++++ 2 files changed, 54 insertions(+) Index: collectd-4.9.1/src/common.h =================================================================== --- collectd-4.9.1.orig/src/common.h 2010-02-05 20:19:05.000000000 +0100 +++ collectd-4.9.1/src/common.h 2010-02-05 21:30:10.000000000 +0100 @@ -47,6 +47,14 @@ || (strcasecmp ("no", (s)) == 0) \ || (strcasecmp ("off", (s)) == 0)) +struct gc_entry { + void *ptr; + struct gc_entry *next; +}; +struct gc_list { + struct gc_entry *list; +}; + char *sstrncpy (char *dest, const char *src, size_t n); int ssnprintf (char *dest, size_t n, const char *format, ...); char *sstrdup(const char *s); @@ -289,4 +297,16 @@ * (in the range [1-65535]). Returns less than zero on error. */ int service_name_to_port_number (const char *service_name); + +/* initialize garbage collector */ +struct gc_list *gc_init(); + +/* register variable 'ptr' to garbage collector */ +void gc_register(struct gc_list *gc, void *ptr); + +/* free all entries of garbage collector */ +void gc_free(struct gc_list *gc); + + + #endif /* COMMON_H */ Index: collectd-4.9.1/src/common.c =================================================================== --- collectd-4.9.1.orig/src/common.c 2010-02-05 20:19:03.000000000 +0100 +++ collectd-4.9.1/src/common.c 2010-02-05 21:31:15.000000000 +0100 @@ -1133,3 +1133,37 @@ return (service_number); return (-1); } /* int service_name_to_port_number */ + +struct gc_list *gc_init() { + struct gc_list * ret; + ret = (struct gc_list *) malloc(sizeof(struct gc_list)); + ret->list = NULL; + return ret; +} + +void gc_register(struct gc_list *gc, void *ptr) { + struct gc_entry *item; + struct gc_entry *tmp; + + tmp = gc->list; + item = (struct gc_entry *) malloc(sizeof(struct gc_entry)); + item->next = tmp; + item->ptr = ptr; + gc->list = item; +} + +void gc_free(struct gc_list *gc) { + struct gc_entry *item; + if (! gc) + return; + item = gc->list; + sfree(gc); + + while (item != NULL) { + struct gc_entry *next = item->next; + sfree(item->ptr); + sfree(item); + item = next; + } +} + --