diff options
author | Timo Teras <timo.teras@iki.fi> | 2010-03-10 20:11:06 +0200 |
---|---|---|
committer | Timo Teras <timo.teras@iki.fi> | 2010-03-10 20:11:06 +0200 |
commit | 0183e33d9a4759764716e771b85e19f7a997b8bd (patch) | |
tree | 7921b52421171899d9df3999625b0f7134148350 /src | |
parent | dc34e87746f69994aad893b39ee4cd3dda6e2f7b (diff) | |
download | libtf-0183e33d9a4759764716e771b85e19f7a997b8bd.tar.bz2 libtf-0183e33d9a4759764716e771b85e19f7a997b8bd.tar.xz |
mem: add mmap allocator
use it for heaps and fiber stacks.
Diffstat (limited to 'src')
-rw-r--r-- | src/TFbuild | 2 | ||||
-rw-r--r-- | src/heap.c | 12 | ||||
-rw-r--r-- | src/mem-mmap.c | 41 | ||||
-rw-r--r-- | src/uctx.h | 7 |
4 files changed, 55 insertions, 7 deletions
diff --git a/src/TFbuild b/src/TFbuild index ef1c5ae..9277f9a 100644 --- a/src/TFbuild +++ b/src/TFbuild @@ -1,7 +1,7 @@ libs-y += libtf libtf-objs-y += fiber.o scheduler.o heap.o -libtf-objs-$(OS_LINUX) += io-epoll.o +libtf-objs-$(OS_LINUX) += io-epoll.o mem-mmap.o libtf-objs-$(OS_UNIX) += io-unix.o CFLAGS_heap.c += -funroll-all-loops @@ -112,12 +112,16 @@ int __tf_heap_grow(struct tf_heap_head *head) { void *item; - if (head->allocated) + if (head->allocated) { + item = tf_bmem_resize(head->item, + head->allocated * sizeof(struct tf_heap_child), + 2 * head->allocated * sizeof(struct tf_heap_child)); head->allocated *= 2; - else - head->allocated = 128; + } else { + head->allocated = 4096 / sizeof(struct tf_heap_child); + item = tf_bmem_alloc(head->allocated * sizeof(struct tf_heap_child)); + } - item = realloc(head->item, head->allocated * sizeof(head->item[0])); if (item == NULL) return -ENOMEM; diff --git a/src/mem-mmap.c b/src/mem-mmap.c new file mode 100644 index 0000000..b8e83cb --- /dev/null +++ b/src/mem-mmap.c @@ -0,0 +1,41 @@ +/* mem-mmap.c - mmap wrappings for large memory allocation + * + * Copyright (C) 2009 Timo Teräs <timo.teras@iki.fi> + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 or later as + * published by the Free Software Foundation. + * + * See http://www.gnu.org/ for details. + */ + +#include <sys/mman.h> +#include <libtf/defines.h> +#include <libtf/memory.h> + +void *tf_bmem_alloc(size_t size) +{ + void *ptr; + + ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS, 0, 0); + if (ptr == MAP_FAILED) + return NULL; + return ptr; +} + +void *tf_bmem_resize(void *oldptr, size_t oldsize, size_t newsize) +{ + void *ptr; + + ptr = mremap(oldptr, oldsize, newsize, MREMAP_MAYMOVE); + if (ptr == MAP_FAILED) + return NULL; + return ptr; +} + +void tf_bmem_free(void *ptr, size_t size) +{ + munmap(ptr, size); +} @@ -11,6 +11,7 @@ */ #include <libtf/fiber.h> +#include <libtf/memory.h> #include <stdio.h> #include <stdlib.h> @@ -26,6 +27,7 @@ struct tf_uctx { int *stack_guard; + size_t size; void *alloc; void *current_sp; unsigned int stack_id; @@ -110,7 +112,7 @@ tf_uctx_create_embedded( void *stack, *stack_base; /* Allocate new stack */ - stack_base = malloc(size); + stack_base = tf_bmem_alloc(size); if (stack_base == NULL) return NULL; @@ -127,6 +129,7 @@ tf_uctx_create_embedded( *uctx = (struct tf_uctx) { .stack_guard = stack_guard(stack_base, size), .alloc = stack_base, + .size = size, .current_sp = stack, .stack_id = VALGRIND_STACK_REGISTER(stack_base, stack_base+size), }; @@ -140,7 +143,7 @@ void tf_uctx_destroy(struct tf_uctx *uctx) { if (uctx->alloc != NULL) { VALGRIND_STACK_DEREGISTER(uctx->stack_id); - free(uctx->alloc); + tf_bmem_free(uctx->alloc, uctx->size); } } |