summaryrefslogtreecommitdiffstats
path: root/src/arena.c
diff options
context:
space:
mode:
authorMike Hommey <mh@glandium.org>2012-04-24 21:22:02 (GMT)
committerJason Evans <je@fb.com>2012-04-29 07:25:34 (GMT)
commit8b49971d0ce0819af78aa2a278c26ecb298ee134 (patch)
treee950255d8d25d34ad7d989c03dfd82c421c7702a /src/arena.c
parentf27899402914065a6c1484ea8d81a2c8b70aa659 (diff)
downloadjemalloc-8b49971d0ce0819af78aa2a278c26ecb298ee134.zip
jemalloc-8b49971d0ce0819af78aa2a278c26ecb298ee134.tar.gz
jemalloc-8b49971d0ce0819af78aa2a278c26ecb298ee134.tar.bz2
Avoid variable length arrays and remove declarations within code
MSVC doesn't support C99, and building as C++ to be able to use them is dangerous, as C++ and C99 are incompatible. Introduce a VARIABLE_ARRAY macro that either uses VLA when supported, or alloca() otherwise. Note that using alloca() inside loops doesn't quite work like VLAs, thus the use of VARIABLE_ARRAY there is discouraged. It might be worth investigating ways to check whether VARIABLE_ARRAY is used in such context at runtime in debug builds and bail out if that happens.
Diffstat (limited to 'src/arena.c')
-rw-r--r--src/arena.c18
1 files changed, 10 insertions, 8 deletions
diff --git a/src/arena.c b/src/arena.c
index f13b5e1..7fac361 100644
--- a/src/arena.c
+++ b/src/arena.c
@@ -640,14 +640,14 @@ arena_chunk_purge(arena_t *arena, arena_chunk_t *chunk)
if (mapelm->bits & CHUNK_MAP_LARGE)
pageind += mapelm->bits >> LG_PAGE;
else {
+ size_t binind;
+ arena_bin_info_t *bin_info;
arena_run_t *run = (arena_run_t *)((uintptr_t)
chunk + (uintptr_t)(pageind << LG_PAGE));
assert((mapelm->bits >> LG_PAGE) == 0);
- size_t binind = arena_bin_index(arena,
- run->bin);
- arena_bin_info_t *bin_info =
- &arena_bin_info[binind];
+ binind = arena_bin_index(arena, run->bin);
+ bin_info = &arena_bin_info[binind];
pageind += bin_info->run_size >> LG_PAGE;
}
}
@@ -1056,11 +1056,12 @@ arena_bin_runs_first(arena_bin_t *bin)
if (mapelm != NULL) {
arena_chunk_t *chunk;
size_t pageind;
+ arena_run_t *run;
chunk = (arena_chunk_t *)CHUNK_ADDR2BASE(mapelm);
pageind = ((((uintptr_t)mapelm - (uintptr_t)chunk->map) /
sizeof(arena_chunk_map_t))) + map_bias;
- arena_run_t *run = (arena_run_t *)((uintptr_t)chunk +
+ run = (arena_run_t *)((uintptr_t)chunk +
(uintptr_t)((pageind - (mapelm->bits >> LG_PAGE)) <<
LG_PAGE));
return (run);
@@ -1596,14 +1597,15 @@ arena_dalloc_bin(arena_t *arena, arena_chunk_t *chunk, void *ptr,
size_t pageind;
arena_run_t *run;
arena_bin_t *bin;
- size_t size;
+ arena_bin_info_t *bin_info;
+ size_t size, binind;
pageind = ((uintptr_t)ptr - (uintptr_t)chunk) >> LG_PAGE;
run = (arena_run_t *)((uintptr_t)chunk + (uintptr_t)((pageind -
(mapelm->bits >> LG_PAGE)) << LG_PAGE));
bin = run->bin;
- size_t binind = arena_bin_index(arena, bin);
- arena_bin_info_t *bin_info = &arena_bin_info[binind];
+ binind = arena_bin_index(arena, bin);
+ bin_info = &arena_bin_info[binind];
if (config_fill || config_stats)
size = bin_info->reg_size;