summaryrefslogtreecommitdiffstats
path: root/src
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 /src
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
Diffstat (limited to 'src')
-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())