diff --git a/configure.in b/configure.in index 380be6224d27..aa1653261bc2 100644 --- a/configure.in +++ b/configure.in @@ -9083,6 +9083,8 @@ if test -z "$MOZ_NATIVE_JEMALLOC" -a "$MOZ_MEMORY" && test -n "$MOZ_JEMALLOC3" - if test "$CROSS_COMPILE"; then ac_configure_args="$ac_configure_args je_cv_static_page_shift=12" fi + # Force disable DSS support in jemalloc. + ac_configure_args="$ac_configure_args ac_cv_func_sbrk=false" if ! test -e memory/jemalloc; then mkdir -p memory/jemalloc diff --git a/memory/jemalloc/0005-Bug-1121314-Avoid-needing-the-arena-in-chunk_alloc_d.patch b/memory/jemalloc/0005-Bug-1121314-Avoid-needing-the-arena-in-chunk_alloc_d.patch new file mode 100644 index 000000000000..89b84dcbbe02 --- /dev/null +++ b/memory/jemalloc/0005-Bug-1121314-Avoid-needing-the-arena-in-chunk_alloc_d.patch @@ -0,0 +1,58 @@ +From 722400adde3b4cb307fdc310e6296e10e6ace7ae Mon Sep 17 00:00:00 2001 +From: Mike Hommey +Date: Wed, 14 Jan 2015 12:49:24 +0900 +Subject: [PATCH] Bug 1121314 - Avoid needing the arena in chunk_alloc_default + to avoid possible infinite loops involving a0malloc + +--- + src/chunk.c | 21 +++++++++++++-------- + 1 file changed, 13 insertions(+), 8 deletions(-) + +diff --git a/src/chunk.c b/src/chunk.c +index 7926452..32e659c 100644 +--- a/src/chunk.c ++++ b/src/chunk.c +@@ -247,27 +247,32 @@ chunk_alloc_arena(chunk_alloc_t *chunk_alloc, chunk_dalloc_t *chunk_dalloc, + return (ret); + } + + /* Default arena chunk allocation routine in the absence of user override. */ + void * + chunk_alloc_default(void *new_addr, size_t size, size_t alignment, bool *zero, + unsigned arena_ind) + { +- arena_t *arena; ++ dss_prec_t dss_prec = dss_prec_disabled; + +- arena = arena_get(tsd_fetch(), arena_ind, false, true); +- /* +- * The arena we're allocating on behalf of must have been initialized +- * already. +- */ +- assert(arena != NULL); ++ if (have_dss) { ++ arena_t *arena; ++ ++ arena = arena_get(tsd_fetch(), arena_ind, false, true); ++ /* ++ * The arena we're allocating on behalf of must have been ++ * initialized already. ++ */ ++ assert(arena != NULL); ++ dss_prec = arena->dss_prec; ++ } + + return (chunk_alloc_core(new_addr, size, alignment, false, zero, +- arena->dss_prec)); ++ dss_prec)); + } + + static void + chunk_record(extent_tree_t *chunks_szad, extent_tree_t *chunks_ad, void *chunk, + size_t size) + { + bool unzeroed; + extent_node_t *xnode, *node, *prev, *xprev, key; +-- +2.2.1.dirty + diff --git a/memory/jemalloc/src/src/chunk.c b/memory/jemalloc/src/src/chunk.c index 7926452729f2..32e659c98c9d 100644 --- a/memory/jemalloc/src/src/chunk.c +++ b/memory/jemalloc/src/src/chunk.c @@ -252,17 +252,22 @@ void * chunk_alloc_default(void *new_addr, size_t size, size_t alignment, bool *zero, unsigned arena_ind) { - arena_t *arena; + dss_prec_t dss_prec = dss_prec_disabled; - arena = arena_get(tsd_fetch(), arena_ind, false, true); - /* - * The arena we're allocating on behalf of must have been initialized - * already. - */ - assert(arena != NULL); + if (have_dss) { + arena_t *arena; + + arena = arena_get(tsd_fetch(), arena_ind, false, true); + /* + * The arena we're allocating on behalf of must have been + * initialized already. + */ + assert(arena != NULL); + dss_prec = arena->dss_prec; + } return (chunk_alloc_core(new_addr, size, alignment, false, zero, - arena->dss_prec)); + dss_prec)); } static void diff --git a/memory/jemalloc/update.sh b/memory/jemalloc/update.sh index a2b34821b3f5..0f763154562a 100755 --- a/memory/jemalloc/update.sh +++ b/memory/jemalloc/update.sh @@ -18,6 +18,7 @@ patch -p1 < ../0001-Dont-overwrite-VERSION-on-a-git-repository.patch patch -p1 < ../0002-Move-variable-declaration-to-the-top-its-block-for-M.patch patch -p1 < ../0003-Add-a-isblank-definition-for-MSVC-2013.patch patch -p1 < ../0004-Implement-stats.bookkeeping.patch +patch -p1 < ../0005-Bug-1121314-Avoid-needing-the-arena-in-chunk_alloc_d.patch cd .. hg addremove -q src