summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2007-07-25 14:43:05 +0000
committerLennart Poettering <lennart@poettering.net>2007-07-25 14:43:05 +0000
commitf42e4438eb5cf81a0a96e2763846faa2f3193223 (patch)
treec7433ffa1843542014861183d3644c13eece8cfc
parent279b1b3311d5e71348a3d5ffa3bc76468e047333 (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
-rw-r--r--src/pulsecore/flist.h35
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())