From f42e4438eb5cf81a0a96e2763846faa2f3193223 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Wed, 25 Jul 2007 14:43:05 +0000 Subject: destruct freelists properly, by using gcc destructors. we do this only to make valgrind shut up, not because it would have any real value during runtime git-svn-id: file:///home/lennart/svn/public/pulseaudio/branches/lennart@1526 fefdeb5f-60dc-0310-8127-8f9354f1896f --- src/pulsecore/flist.h | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/src/pulsecore/flist.h b/src/pulsecore/flist.h index 102d30ea..177edd6a 100644 --- a/src/pulsecore/flist.h +++ b/src/pulsecore/flist.h @@ -27,6 +27,7 @@ #include #include +#include /* A multiple-reader multipler-write lock-free free list implementation */ @@ -40,20 +41,26 @@ void pa_flist_free(pa_flist *l, pa_free_cb_t free_cb); int pa_flist_push(pa_flist*l, void *p); void* pa_flist_pop(pa_flist*l); -#define PA_STATIC_FLIST_DECLARE(name, size) \ - static struct { \ - pa_flist *flist; \ - pa_once_t once; \ - } name##_static_flist = { NULL, PA_ONCE_INIT }; \ - \ - static void name##_init(void) { \ - name##_static_flist.flist = pa_flist_new(size); \ - } \ - \ - static inline pa_flist* name##_get(void) { \ - pa_once(&name##_static_flist.once, name##_init); \ - return name##_static_flist.flist; \ - } \ +/* Please not that the destructor stuff is not really necesary, we do + * this just to make valgrind output more useful. */ + +#define PA_STATIC_FLIST_DECLARE(name, size, destroy_cb) \ + static struct { \ + pa_flist *flist; \ + pa_once_t once; \ + } name##_static_flist = { NULL, PA_ONCE_INIT }; \ + static void name##_init(void) { \ + name##_static_flist.flist = pa_flist_new(size); \ + } \ + static inline pa_flist* name##_get(void) { \ + pa_once(&name##_static_flist.once, name##_init); \ + return name##_static_flist.flist; \ + } \ + static void name##_destructor(void) PA_GCC_DESTRUCTOR; \ + static void name##_destructor(void) { \ + if (name##_static_flist.flist) \ + pa_flist_free(name##_static_flist.flist, destroy_cb); \ + } \ struct __stupid_useless_struct_to_allow_trailing_semicolon #define PA_STATIC_FLIST_GET(name) (name##_get()) -- cgit