summaryrefslogtreecommitdiffstats
path: root/src
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
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')
-rw-r--r--src/arena.c18
-rw-r--r--src/ctl.c4
-rw-r--r--src/stats.c4
-rw-r--r--src/tsd.c2
4 files changed, 15 insertions, 13 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;
diff --git a/src/ctl.c b/src/ctl.c
index 4b41d1d..2734604 100644
--- a/src/ctl.c
+++ b/src/ctl.c
@@ -520,7 +520,7 @@ static void
ctl_refresh(void)
{
unsigned i;
- arena_t *tarenas[narenas];
+ VARIABLE_ARRAY(arena_t *, tarenas, narenas);
if (config_stats) {
malloc_mutex_lock(&chunks_mtx);
@@ -1232,7 +1232,7 @@ arenas_purge_ctl(const size_t *mib, size_t miblen, void *oldp, size_t *oldlenp,
ret = EFAULT;
goto label_return;
} else {
- arena_t *tarenas[narenas];
+ VARIABLE_ARRAY(arena_t *, tarenas, narenas);
malloc_mutex_lock(&arenas_lock);
memcpy(tarenas, arenas, sizeof(arena_t *) * narenas);
diff --git a/src/stats.c b/src/stats.c
index 08f7098..2854b30 100644
--- a/src/stats.c
+++ b/src/stats.c
@@ -498,7 +498,7 @@ stats_print(void (*write_cb)(void *, const char *), void *cbopaque,
CTL_GET("arenas.narenas", &narenas, unsigned);
{
- bool initialized[narenas];
+ VARIABLE_ARRAY(bool, initialized, narenas);
size_t isz;
unsigned i, ninitialized;
@@ -527,7 +527,7 @@ stats_print(void (*write_cb)(void *, const char *), void *cbopaque,
CTL_GET("arenas.narenas", &narenas, unsigned);
{
- bool initialized[narenas];
+ VARIABLE_ARRAY(bool, initialized, narenas);
size_t isz;
unsigned i;
diff --git a/src/tsd.c b/src/tsd.c
index 09f06e8..d7714b0 100644
--- a/src/tsd.c
+++ b/src/tsd.c
@@ -36,7 +36,7 @@ JEMALLOC_ATTR(visibility("default"))
void
_malloc_thread_cleanup(void)
{
- bool pending[ncleanups], again;
+ bool pending[MALLOC_TSD_CLEANUPS_MAX], again;
unsigned i;
for (i = 0; i < ncleanups; i++)