summaryrefslogtreecommitdiff
path: root/lib/libc/stdlib
diff options
context:
space:
mode:
authoryamt <yamt@NetBSD.org>2007-10-15 00:05:00 +0000
committeryamt <yamt@NetBSD.org>2007-10-15 00:05:00 +0000
commit14bfffc9db2f85b91184274e168889bd64c673fc (patch)
tree8f22b52a8d086919768f94e835e84453774cfb47 /lib/libc/stdlib
parent27701280d7bee3ed8449459498fd02db258c4880 (diff)
use MAP_ALIGNED.
Diffstat (limited to 'lib/libc/stdlib')
-rw-r--r--lib/libc/stdlib/jemalloc.c43
1 files changed, 17 insertions, 26 deletions
diff --git a/lib/libc/stdlib/jemalloc.c b/lib/libc/stdlib/jemalloc.c
index db76b51acba..ea1bc1207fa 100644
--- a/lib/libc/stdlib/jemalloc.c
+++ b/lib/libc/stdlib/jemalloc.c
@@ -1,4 +1,4 @@
-/* $NetBSD: jemalloc.c,v 1.4 2007/10/09 00:59:52 ad Exp $ */
+/* $NetBSD: jemalloc.c,v 1.5 2007/10/15 00:05:00 yamt Exp $ */
/*-
* Copyright (C) 2006,2007 Jason Evans <jasone@FreeBSD.org>.
@@ -118,7 +118,7 @@
#include <sys/cdefs.h>
/* __FBSDID("$FreeBSD: src/lib/libc/stdlib/malloc.c,v 1.147 2007/06/15 22:00:16 jasone Exp $"); */
-__RCSID("$NetBSD: jemalloc.c,v 1.4 2007/10/09 00:59:52 ad Exp $");
+__RCSID("$NetBSD: jemalloc.c,v 1.5 2007/10/15 00:05:00 yamt Exp $");
#ifdef __FreeBSD__
#include "libc_private.h"
@@ -642,6 +642,7 @@ static size_t quantum_mask; /* (quantum - 1). */
/* Various chunk-related settings. */
static size_t chunksize;
static size_t chunksize_mask; /* (chunksize - 1). */
+static int chunksize_2pow;
static unsigned chunk_npages;
static unsigned arena_chunk_header_npages;
static size_t arena_maxclass; /* Max size class for arenas. */
@@ -798,6 +799,7 @@ static void base_chunk_node_dealloc(chunk_node_t *node);
static void stats_print(arena_t *arena);
#endif
static void *pages_map(void *addr, size_t size);
+static void *pages_map_align(void *addr, size_t size, int align);
static void pages_unmap(void *addr, size_t size);
static void *chunk_alloc(size_t size);
static void chunk_dealloc(void *chunk, size_t size);
@@ -1202,7 +1204,7 @@ RB_GENERATE_STATIC(chunk_tree_s, chunk_node_s, link, chunk_comp);
#endif
static void *
-pages_map(void *addr, size_t size)
+pages_map_align(void *addr, size_t size, int align)
{
void *ret;
@@ -1210,8 +1212,8 @@ pages_map(void *addr, size_t size)
* We don't use MAP_FIXED here, because it can cause the *replacement*
* of existing mappings, and we only want to create new mappings.
*/
- ret = mmap(addr, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON,
- -1, 0);
+ ret = mmap(addr, size, PROT_READ | PROT_WRITE,
+ MAP_PRIVATE | MAP_ANON | MAP_ALIGNED(align), -1, 0);
assert(ret != NULL);
if (ret == MAP_FAILED)
@@ -1237,6 +1239,13 @@ pages_map(void *addr, size_t size)
return (ret);
}
+static void *
+pages_map(void *addr, size_t size)
+{
+
+ return pages_map_align(addr, size, 0);
+}
+
static void
pages_unmap(void *addr, size_t size)
{
@@ -1304,27 +1313,8 @@ chunk_alloc(size_t size)
* anywhere. Beware of size_t wrap-around.
*/
if (size + chunksize > size) {
- if ((ret = pages_map(NULL, size + chunksize)) != NULL) {
- size_t offset = CHUNK_ADDR2OFFSET(ret);
-
- /*
- * Success. Clean up unneeded leading/trailing space.
- */
- if (offset != 0) {
- /* Leading space. */
- pages_unmap(ret, chunksize - offset);
-
- ret = (void *)((uintptr_t)ret + (chunksize -
- offset));
-
- /* Trailing space. */
- pages_unmap((void *)((uintptr_t)ret + size),
- offset);
- } else {
- /* Trailing space only. */
- pages_unmap((void *)((uintptr_t)ret + size),
- chunksize);
- }
+ if ((ret = pages_map_align(NULL, size, chunksize_2pow))
+ != NULL) {
goto RETURN;
}
}
@@ -3464,6 +3454,7 @@ malloc_init_hard(void)
/* Set variables according to the value of opt_chunk_2pow. */
chunksize = (1LU << opt_chunk_2pow);
chunksize_mask = chunksize - 1;
+ chunksize_2pow = opt_chunk_2pow;
chunk_npages = (chunksize >> pagesize_2pow);
{
unsigned header_size;