提交 b434e2b7 authored 作者: Anthony Minessale's avatar Anthony Minessale

add map_anonymoys support

上级 aebc6467
...@@ -66,6 +66,11 @@ ...@@ -66,6 +66,11 @@
*/ */
#define MPOOL_FLAG_USE_SBRK (1<<3) #define MPOOL_FLAG_USE_SBRK (1<<3)
/*
* Use MMAP_ANONYMOUS instead of /dev/zero
*/
#define MPOOL_FLAG_ANONYMOUS (1<<4)
/* /*
* Mpool error codes * Mpool error codes
*/ */
......
...@@ -73,6 +73,7 @@ ...@@ -73,6 +73,7 @@
typedef struct { typedef struct {
unsigned int mp_magic; /* magic number for struct */ unsigned int mp_magic; /* magic number for struct */
unsigned int mp_flags; /* flags for the struct */ unsigned int mp_flags; /* flags for the struct */
unsigned int mp_mmflags; /* flags for mmap */
unsigned long mp_alloc_c; /* number of allocations */ unsigned long mp_alloc_c; /* number of allocations */
unsigned long mp_user_alloc; /* user bytes allocated */ unsigned long mp_user_alloc; /* user bytes allocated */
unsigned long mp_max_alloc; /* maximum user bytes allocated */ unsigned long mp_max_alloc; /* maximum user bytes allocated */
......
...@@ -273,7 +273,7 @@ static void *alloc_pages(mpool_t *mp_p, const unsigned int page_n, ...@@ -273,7 +273,7 @@ static void *alloc_pages(mpool_t *mp_p, const unsigned int page_n,
#endif #endif
/* mmap from /dev/zero */ /* mmap from /dev/zero */
mem = mmap((caddr_t)mp_p->mp_addr, size, PROT_READ | PROT_WRITE, state, mem = mmap((caddr_t)mp_p->mp_addr, size, mp_p->mp_mmflags, state,
mp_p->mp_fd, mp_p->mp_top); mp_p->mp_fd, mp_p->mp_top);
if (mem == (void *)MAP_FAILED) { if (mem == (void *)MAP_FAILED) {
if (errno == ENOMEM) { if (errno == ENOMEM) {
...@@ -937,17 +937,24 @@ mpool_t *mpool_open(const unsigned int flags, const unsigned int page_size, ...@@ -937,17 +937,24 @@ mpool_t *mpool_open(const unsigned int flags, const unsigned int page_size,
} }
} }
mp.mp_mmflags = PROT_READ | PROT_WRITE;
if (BIT_IS_SET(flags, MPOOL_FLAG_USE_SBRK)) { if (BIT_IS_SET(flags, MPOOL_FLAG_USE_SBRK)) {
mp.mp_fd = -1; mp.mp_fd = -1;
mp.mp_addr = NULL; mp.mp_addr = NULL;
mp.mp_top = 0; mp.mp_top = 0;
} }
else { else {
/* open dev-zero for our mmaping */ if (BIT_IS_SET(flags, MPOOL_FLAG_ANONYMOUS)) {
mp.mp_fd = open("/dev/zero", O_RDWR, 0); mp.mp_fd = -1;
if (mp.mp_fd < 0) { mp.mp_mmflags |= MAP_ANONYMOUS;
SET_POINTER(error_p, MPOOL_ERROR_OPEN_ZERO); } else {
return NULL; /* open dev-zero for our mmaping */
mp.mp_fd = open("/dev/zero", O_RDWR, 0);
if (mp.mp_fd < 0) {
SET_POINTER(error_p, MPOOL_ERROR_OPEN_ZERO);
return NULL;
}
} }
mp.mp_addr = start_addr; mp.mp_addr = start_addr;
/* we start at the front of the file */ /* we start at the front of the file */
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论