mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-10-29 05:40:23 -04:00
Fix up portability of memory pool handling a bit.
git-svn-id: file:///home/lennart/svn/public/pulseaudio/trunk@1319 fefdeb5f-60dc-0310-8127-8f9354f1896f
This commit is contained in:
parent
fef4a20599
commit
cf7b401ac6
1 changed files with 45 additions and 35 deletions
|
|
@ -54,8 +54,6 @@ static char *segment_name(char *fn, size_t l, unsigned id) {
|
||||||
return fn;
|
return fn;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_SHM_OPEN
|
|
||||||
|
|
||||||
int pa_shm_create_rw(pa_shm *m, size_t size, int shared, mode_t mode) {
|
int pa_shm_create_rw(pa_shm *m, size_t size, int shared, mode_t mode) {
|
||||||
char fn[32];
|
char fn[32];
|
||||||
int fd = -1;
|
int fd = -1;
|
||||||
|
|
@ -90,9 +88,10 @@ int pa_shm_create_rw(pa_shm *m, size_t size, int shared, mode_t mode) {
|
||||||
m->do_unlink = 0;
|
m->do_unlink = 0;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
#ifdef HAVE_SHM_OPEN
|
||||||
pa_random(&m->id, sizeof(m->id));
|
pa_random(&m->id, sizeof(m->id));
|
||||||
segment_name(fn, sizeof(fn), m->id);
|
segment_name(fn, sizeof(fn), m->id);
|
||||||
|
|
||||||
if ((fd = shm_open(fn, O_RDWR|O_CREAT|O_EXCL, mode & 0444)) < 0) {
|
if ((fd = shm_open(fn, O_RDWR|O_CREAT|O_EXCL, mode & 0444)) < 0) {
|
||||||
pa_log("shm_open() failed: %s", pa_cstrerror(errno));
|
pa_log("shm_open() failed: %s", pa_cstrerror(errno));
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
@ -110,6 +109,9 @@ int pa_shm_create_rw(pa_shm *m, size_t size, int shared, mode_t mode) {
|
||||||
|
|
||||||
close(fd);
|
close(fd);
|
||||||
m->do_unlink = 1;
|
m->do_unlink = 1;
|
||||||
|
#else
|
||||||
|
return -1;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
m->shared = shared;
|
m->shared = shared;
|
||||||
|
|
@ -118,40 +120,52 @@ int pa_shm_create_rw(pa_shm *m, size_t size, int shared, mode_t mode) {
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
|
|
||||||
|
#ifdef HAVE_SHM_OPEN
|
||||||
if (fd >= 0) {
|
if (fd >= 0) {
|
||||||
shm_unlink(fn);
|
shm_unlink(fn);
|
||||||
close(fd);
|
close(fd);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void pa_shm_free(pa_shm *m) {
|
void pa_shm_free(pa_shm *m) {
|
||||||
char fn[32];
|
|
||||||
|
|
||||||
assert(m);
|
assert(m);
|
||||||
assert(m->ptr && m->ptr != MAP_FAILED);
|
assert(m->ptr);
|
||||||
assert(m->size > 0);
|
assert(m->size > 0);
|
||||||
|
|
||||||
#if !defined(MAP_ANONYMOUS) && defined(HAVE_POSIX_MEMALIGN)
|
#ifdef MAP_FAILED
|
||||||
if (!m->shared)
|
assert(m->ptr != MAP_FAILED);
|
||||||
free(m->ptr);
|
#endif
|
||||||
else
|
|
||||||
#elif !defined(MAP_ANONYMOUS)
|
|
||||||
if (!m->shared)
|
|
||||||
pa_xfree(m->ptr);
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (munmap(m->ptr, m->size) < 0)
|
|
||||||
pa_log("munmap() failed: %s", pa_cstrerror(errno));
|
|
||||||
|
|
||||||
if (m->do_unlink) {
|
if (!m->shared) {
|
||||||
segment_name(fn, sizeof(fn), m->id);
|
#ifdef MAP_ANONYMOUS
|
||||||
|
if (munmap(m->ptr, m->size) < 0)
|
||||||
if (shm_unlink(fn) < 0)
|
pa_log("munmap() failed: %s", pa_cstrerror(errno));
|
||||||
pa_log(__FILE__":shm_unlink(%s) failed: %s", fn, pa_cstrerror(errno));
|
#elif defined(HAVE_POSIX_MEMALIGN)
|
||||||
}
|
free(m->ptr);
|
||||||
|
#else
|
||||||
|
pa_xfree(m->ptr);
|
||||||
|
#endif
|
||||||
|
} else {
|
||||||
|
#ifdef HAVE_SHM_OPEN
|
||||||
|
if (munmap(m->ptr, m->size) < 0)
|
||||||
|
pa_log("munmap() failed: %s", pa_cstrerror(errno));
|
||||||
|
|
||||||
|
if (m->do_unlink) {
|
||||||
|
char fn[32];
|
||||||
|
|
||||||
|
segment_name(fn, sizeof(fn), m->id);
|
||||||
|
|
||||||
|
if (shm_unlink(fn) < 0)
|
||||||
|
pa_log(__FILE__":shm_unlink(%s) failed: %s", fn, pa_cstrerror(errno));
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
/* We shouldn't be here without shm support */
|
||||||
|
assert(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
memset(m, 0, sizeof(*m));
|
memset(m, 0, sizeof(*m));
|
||||||
}
|
}
|
||||||
|
|
@ -160,11 +174,15 @@ void pa_shm_punch(pa_shm *m, size_t offset, size_t size) {
|
||||||
void *ptr;
|
void *ptr;
|
||||||
|
|
||||||
assert(m);
|
assert(m);
|
||||||
assert(m->ptr && m->ptr != MAP_FAILED);
|
assert(m->ptr);
|
||||||
assert(m->size > 0);
|
assert(m->size > 0);
|
||||||
assert(offset < m->size);
|
assert(offset < m->size);
|
||||||
assert(offset+size < m->size);
|
assert(offset+size < m->size);
|
||||||
|
|
||||||
|
#ifdef MAP_FAILED
|
||||||
|
assert(m->ptr != MAP_FAILED);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* You're welcome to implement this as NOOP on systems that don't
|
/* You're welcome to implement this as NOOP on systems that don't
|
||||||
* support it */
|
* support it */
|
||||||
|
|
||||||
|
|
@ -200,6 +218,8 @@ void pa_shm_punch(pa_shm *m, size_t offset, size_t size) {
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_SHM_OPEN
|
||||||
|
|
||||||
int pa_shm_attach_ro(pa_shm *m, unsigned id) {
|
int pa_shm_attach_ro(pa_shm *m, unsigned id) {
|
||||||
char fn[32];
|
char fn[32];
|
||||||
int fd = -1;
|
int fd = -1;
|
||||||
|
|
@ -247,16 +267,6 @@ fail:
|
||||||
|
|
||||||
#else /* HAVE_SHM_OPEN */
|
#else /* HAVE_SHM_OPEN */
|
||||||
|
|
||||||
int pa_shm_create_rw(pa_shm *m, size_t size, int shared, mode_t mode) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void pa_shm_free(pa_shm *m) {
|
|
||||||
}
|
|
||||||
|
|
||||||
void pa_shm_punch(pa_shm *m, size_t offset, size_t size) {
|
|
||||||
}
|
|
||||||
|
|
||||||
int pa_shm_attach_ro(pa_shm *m, unsigned id) {
|
int pa_shm_attach_ro(pa_shm *m, unsigned id) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue