diff options
author | Lennart Poettering <lennart@poettering.net> | 2007-07-25 14:43:05 +0000 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2007-07-25 14:43:05 +0000 |
commit | f42e4438eb5cf81a0a96e2763846faa2f3193223 (patch) | |
tree | c7433ffa1843542014861183d3644c13eece8cfc /src | |
parent | 279b1b3311d5e71348a3d5ffa3bc76468e047333 (diff) |
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
Diffstat (limited to 'src')
-rw-r--r-- | src/pulsecore/flist.h | 35 |
1 files 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 <pulse/def.h> #include <pulsecore/once.h> +#include <pulsecore/gccmacro.h> /* 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()) |