summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2006-08-19 17:27:27 +0000
committerLennart Poettering <lennart@poettering.net>2006-08-19 17:27:27 +0000
commit3e0f00f93deed28e68b60f29fc42838575241b0e (patch)
treeb4cad6f5ebccaf2b471d002ab58c62dfd9edd8b4
parentd50c56a8f31515e1678b5d56b34a00b58b735539 (diff)
if MAP_ANONYMOUS is not supported use posix_memalign if possible to allocate the memory pool
git-svn-id: file:///home/lennart/svn/public/pulseaudio/trunk@1296 fefdeb5f-60dc-0310-8127-8f9354f1896f
-rw-r--r--src/pulsecore/shm.c21
1 files changed, 19 insertions, 2 deletions
diff --git a/src/pulsecore/shm.c b/src/pulsecore/shm.c
index 52867d2a..02528126 100644
--- a/src/pulsecore/shm.c
+++ b/src/pulsecore/shm.c
@@ -19,6 +19,10 @@
USA.
***/
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
#include <assert.h>
#include <stdlib.h>
#include <unistd.h>
@@ -32,6 +36,7 @@
#include <pulsecore/core-error.h>
#include <pulsecore/log.h>
#include <pulsecore/random.h>
+#include <pulse/xmalloc.h>
#include "shm.h"
@@ -64,6 +69,15 @@ int pa_shm_create_rw(pa_shm *m, size_t size, int shared, mode_t mode) {
pa_log("mmap() failed: %s", pa_cstrerror(errno));
goto fail;
}
+#elif defined(HAVE_POSIX_MEMALIGN)
+ {
+ int r;
+
+ if ((r = posix_memalign(&m->ptr, sysconf(_SC_PAGESIZE), size)) < 0) {
+ pa_log("posix_memalign() failed: %s", pa_cstrerror(r));
+ goto fail;
+ }
+ }
#else
m->ptr = pa_xmalloc(m->size);
#endif
@@ -114,7 +128,11 @@ void pa_shm_free(pa_shm *m) {
assert(m->ptr && m->ptr != MAP_FAILED);
assert(m->size > 0);
-#ifndef MAP_ANONYMOUS
+#if !defined(MAP_ANONYMOUS) && defined(HAVE_POSIX_MEMALIGN)
+ if (!m->shared)
+ free(m->ptr);
+ else
+#elif !defined(MAP_ANONYMOUS)
if (!m->shared)
pa_xfree(m->ptr);
else
@@ -139,7 +157,6 @@ void pa_shm_punch(pa_shm *m, size_t offset, size_t size) {
assert(m);
assert(m->ptr && m->ptr != MAP_FAILED);
assert(m->size > 0);
- assert(m->do_unlink);
assert(offset < m->size);
assert(offset+size < m->size);