2010-04-13 12:13:46 +00:00
|
|
|
|
|
|
|
/* $Id: fpm_shm.c,v 1.3 2008/05/24 17:38:47 anight Exp $ */
|
2011-06-26 15:48:11 +00:00
|
|
|
/* (c) 2007,2008 Andrei Nigmatulin, Jerome Loyet */
|
2010-04-13 12:13:46 +00:00
|
|
|
|
|
|
|
#include <sys/mman.h>
|
2011-06-26 15:48:11 +00:00
|
|
|
#include <errno.h>
|
|
|
|
#include <string.h>
|
2010-04-13 12:13:46 +00:00
|
|
|
|
|
|
|
#include "fpm_shm.h"
|
|
|
|
#include "zlog.h"
|
|
|
|
|
|
|
|
|
|
|
|
/* MAP_ANON is deprecated, but not in macosx */
|
|
|
|
#if defined(MAP_ANON) && !defined(MAP_ANONYMOUS)
|
|
|
|
#define MAP_ANONYMOUS MAP_ANON
|
|
|
|
#endif
|
|
|
|
|
2011-06-27 11:33:03 +00:00
|
|
|
static size_t fpm_shm_size = 0;
|
|
|
|
|
2011-06-26 15:48:11 +00:00
|
|
|
void *fpm_shm_alloc(size_t size) /* {{{ */
|
2010-04-13 12:13:46 +00:00
|
|
|
{
|
2011-06-26 15:48:11 +00:00
|
|
|
void *mem;
|
2010-04-13 12:13:46 +00:00
|
|
|
|
2011-06-26 15:48:11 +00:00
|
|
|
mem = mmap(0, size, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_SHARED, -1, 0);
|
2010-04-13 12:13:46 +00:00
|
|
|
|
2011-06-26 15:48:11 +00:00
|
|
|
#ifdef MAP_FAILED
|
|
|
|
if (mem == MAP_FAILED) {
|
|
|
|
zlog(ZLOG_SYSERROR, "unable to allocate %zu bytes in shared memory: %s", size, strerror(errno));
|
|
|
|
return NULL;
|
2010-04-13 12:13:46 +00:00
|
|
|
}
|
2011-06-26 15:48:11 +00:00
|
|
|
#endif
|
2010-04-13 12:13:46 +00:00
|
|
|
|
2011-06-26 15:48:11 +00:00
|
|
|
if (!mem) {
|
|
|
|
zlog(ZLOG_SYSERROR, "unable to allocate %zu bytes in shared memory", size);
|
|
|
|
return NULL;
|
2010-04-13 12:13:46 +00:00
|
|
|
}
|
|
|
|
|
2011-06-26 15:48:11 +00:00
|
|
|
memset(mem, size, 0);
|
2011-06-27 11:33:03 +00:00
|
|
|
fpm_shm_size += size;
|
2011-06-26 15:48:11 +00:00
|
|
|
return mem;
|
2010-04-13 12:13:46 +00:00
|
|
|
}
|
|
|
|
/* }}} */
|
|
|
|
|
2011-06-26 15:48:11 +00:00
|
|
|
int fpm_shm_free(void *mem, size_t size) /* {{{ */
|
2010-04-13 12:13:46 +00:00
|
|
|
{
|
2011-06-26 15:48:11 +00:00
|
|
|
if (!mem) {
|
|
|
|
zlog(ZLOG_ERROR, "mem is NULL");
|
|
|
|
return 0;
|
2010-04-13 12:13:46 +00:00
|
|
|
}
|
|
|
|
|
2011-06-26 15:48:11 +00:00
|
|
|
if (munmap(mem, size) == -1) {
|
2011-07-19 22:18:08 +00:00
|
|
|
zlog(ZLOG_SYSERROR, "Unable to free shm");
|
2011-06-26 15:48:11 +00:00
|
|
|
return 0;
|
2010-04-13 12:13:46 +00:00
|
|
|
}
|
|
|
|
|
2011-06-27 11:33:03 +00:00
|
|
|
if (fpm_shm_size - size > 0) {
|
|
|
|
fpm_shm_size -= size;
|
|
|
|
} else {
|
|
|
|
fpm_shm_size = 0;
|
|
|
|
}
|
2010-04-13 12:13:46 +00:00
|
|
|
|
2011-06-26 15:48:11 +00:00
|
|
|
return 1;
|
2010-04-13 12:13:46 +00:00
|
|
|
}
|
|
|
|
/* }}} */
|
|
|
|
|
2011-06-27 11:33:03 +00:00
|
|
|
size_t fpm_shm_get_size_allocated() /* {{{*/
|
|
|
|
{
|
|
|
|
return fpm_shm_size;
|
|
|
|
}
|
|
|
|
/* }}} */
|