From 7dabe051cdd3980887a78a6cfe8e06666e2b21c9 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Wed, 1 Jul 2009 20:22:38 +0200 Subject: memtrap: properly lock access to memtrap changer --- src/pulsecore/memtrap.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'src/pulsecore/memtrap.c') diff --git a/src/pulsecore/memtrap.c b/src/pulsecore/memtrap.c index e06f60ca..7d917450 100644 --- a/src/pulsecore/memtrap.c +++ b/src/pulsecore/memtrap.c @@ -37,6 +37,7 @@ #include #include #include +#include #include "memtrap.h" @@ -49,6 +50,7 @@ struct pa_memtrap { static pa_memtrap *memtraps[2] = { NULL, NULL }; static pa_aupdate *aupdate; +static pa_static_mutex mutex = PA_STATIC_MUTEX_INIT; /* only required to serialize access to the write side */ static void allocate_aupdate(void) { PA_ONCE_BEGIN { @@ -124,6 +126,7 @@ static void memtrap_unlink(pa_memtrap *m, unsigned j) { pa_memtrap* pa_memtrap_add(const void *start, size_t size) { pa_memtrap *m = NULL; unsigned j; + pa_mutex *mx; pa_assert(start); pa_assert(size > 0); @@ -138,33 +141,45 @@ pa_memtrap* pa_memtrap_add(const void *start, size_t size) { allocate_aupdate(); + mx = pa_static_mutex_get(&mutex, FALSE, TRUE); + pa_mutex_lock(mx); + j = pa_aupdate_write_begin(aupdate); memtrap_link(m, j); j = pa_aupdate_write_swap(aupdate); memtrap_link(m, j); pa_aupdate_write_end(aupdate); + pa_mutex_unlock(mx); + return m; } void pa_memtrap_remove(pa_memtrap *m) { unsigned j; + pa_mutex *mx; pa_assert(m); allocate_aupdate(); + mx = pa_static_mutex_get(&mutex, FALSE, TRUE); + pa_mutex_lock(mx); + j = pa_aupdate_write_begin(aupdate); memtrap_unlink(m, j); j = pa_aupdate_write_swap(aupdate); memtrap_unlink(m, j); pa_aupdate_write_end(aupdate); + pa_mutex_unlock(mx); + pa_xfree(m); } pa_memtrap *pa_memtrap_update(pa_memtrap *m, const void *start, size_t size) { unsigned j; + pa_mutex *mx; pa_assert(m); @@ -176,6 +191,9 @@ pa_memtrap *pa_memtrap_update(pa_memtrap *m, const void *start, size_t size) { allocate_aupdate(); + mx = pa_static_mutex_get(&mutex, FALSE, TRUE); + pa_mutex_lock(mx); + j = pa_aupdate_write_begin(aupdate); if (m->start == start && m->size == size) @@ -194,6 +212,8 @@ pa_memtrap *pa_memtrap_update(pa_memtrap *m, const void *start, size_t size) { unlock: pa_aupdate_write_end(aupdate); + pa_mutex_unlock(mx); + return m; } -- cgit From 0225ef68f2876bebd14977882db313fd7f3f6d64 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Mon, 20 Jul 2009 15:50:02 +0100 Subject: memtrap: clarify that we are not interested in the return value of write() --- src/pulsecore/memtrap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/pulsecore/memtrap.c') diff --git a/src/pulsecore/memtrap.c b/src/pulsecore/memtrap.c index 7d917450..c647e507 100644 --- a/src/pulsecore/memtrap.c +++ b/src/pulsecore/memtrap.c @@ -65,7 +65,7 @@ pa_bool_t pa_memtrap_is_good(pa_memtrap *m) { } static void sigsafe_error(const char *s) { - write(STDERR_FILENO, s, strlen(s)); + (void) write(STDERR_FILENO, s, strlen(s)); } static void signal_handler(int sig, siginfo_t* si, void *data) { -- cgit