From c6954b2064a82404e747d9a763fe8e8d7135e202 Mon Sep 17 00:00:00 2001 From: Christopher Ferris Date: Fri, 28 Sep 2018 12:50:26 -0700 Subject: Further updates to jemalloc code. Add support for svelte. Add je_iterate support. Update some of the internals so that bad pointers in je_iterate do not crash. Test: Ran new bionic unit tests, ran libmemunreachable tests, booted system. Change-Id: I04171cf88df16d8dc2c2ebb60327e58b915b9d83 --- include/jemalloc/internal/jemalloc_internal_defs.h | 9 +++-- .../internal/jemalloc_internal_defs_host.h | 2 ++ include/jemalloc/internal/rtree.h | 38 ++++++++++++++++++---- include/jemalloc/jemalloc_rename.h | 2 +- 4 files changed, 40 insertions(+), 11 deletions(-) (limited to 'include') diff --git a/include/jemalloc/internal/jemalloc_internal_defs.h b/include/jemalloc/internal/jemalloc_internal_defs.h index 29948a2c..15886468 100644 --- a/include/jemalloc/internal/jemalloc_internal_defs.h +++ b/include/jemalloc/internal/jemalloc_internal_defs.h @@ -1,4 +1,6 @@ -#if !defined(__ANDROID__) +/* Include cdefs to see if __BIONIC__ is set */ +#include +#if !defined(__BIONIC__) #include "jemalloc_internal_defs_host.h" #else /* include/jemalloc/internal/jemalloc_internal_defs.h. Generated from jemalloc_internal_defs.h.in by configure. */ @@ -297,12 +299,13 @@ * MADV_FREE, though typically with higher * system overhead. */ -#define JEMALLOC_PURGE_MADVISE_FREE +/* MADV_FREE available since kernel 4.5 but not all devices support this yet. */ +/* #undef JEMALLOC_PURGE_MADVISE_FREE */ #define JEMALLOC_PURGE_MADVISE_DONTNEED #define JEMALLOC_PURGE_MADVISE_DONTNEED_ZEROS /* Defined if madvise(2) is available but MADV_FREE is not (x86 Linux only). */ -/* #undef JEMALLOC_DEFINE_MADVISE_FREE */ +#define JEMALLOC_DEFINE_MADVISE_FREE /* * Defined if MADV_DO[NT]DUMP is supported as an argument to madvise. diff --git a/include/jemalloc/internal/jemalloc_internal_defs_host.h b/include/jemalloc/internal/jemalloc_internal_defs_host.h index 480a8356..38f91bc2 100644 --- a/include/jemalloc/internal/jemalloc_internal_defs_host.h +++ b/include/jemalloc/internal/jemalloc_internal_defs_host.h @@ -334,7 +334,9 @@ #define LG_SIZEOF_INTMAX_T 3 /* glibc malloc hooks (__malloc_hook, __realloc_hook, __free_hook). */ +#if !defined(__ANDROID__) #define JEMALLOC_GLIBC_MALLOC_HOOK +#endif /* glibc memalign hook. */ #define JEMALLOC_GLIBC_MEMALIGN_HOOK diff --git a/include/jemalloc/internal/rtree.h b/include/jemalloc/internal/rtree.h index b59d33a8..2124b095 100644 --- a/include/jemalloc/internal/rtree.h +++ b/include/jemalloc/internal/rtree.h @@ -336,7 +336,12 @@ rtree_leaf_elm_lookup(tsdn_t *tsdn, rtree_t *rtree, rtree_ctx_t *rtree_ctx, /* Fast path: L1 direct mapped cache. */ if (likely(rtree_ctx->cache[slot].leafkey == leafkey)) { rtree_leaf_elm_t *leaf = rtree_ctx->cache[slot].leaf; - assert(leaf != NULL); + /* ANDROID CHANGE: Bad pointers return NULL */ + /* assert(leaf != NULL); */ + if (leaf == NULL) { + return NULL; + } + /* ANDROID END CHANGE */ uintptr_t subkey = rtree_subkey(key, RTREE_HEIGHT-1); return &leaf[subkey]; } @@ -347,7 +352,12 @@ rtree_leaf_elm_lookup(tsdn_t *tsdn, rtree_t *rtree, rtree_ctx_t *rtree_ctx, #define RTREE_CACHE_CHECK_L2(i) do { \ if (likely(rtree_ctx->l2_cache[i].leafkey == leafkey)) { \ rtree_leaf_elm_t *leaf = rtree_ctx->l2_cache[i].leaf; \ - assert(leaf != NULL); \ + /* ANDROID CHANGE: Bad pointers return NULL */ \ + /* assert(leaf != NULL); */ \ + if (leaf == NULL) { \ + return NULL; \ + } \ + /* ANDROID END CHANGE */ \ if (i > 0) { \ /* Bubble up by one. */ \ rtree_ctx->l2_cache[i].leafkey = \ @@ -405,7 +415,10 @@ rtree_read(tsdn_t *tsdn, rtree_t *rtree, rtree_ctx_t *rtree_ctx, uintptr_t key, bool dependent) { rtree_leaf_elm_t *elm = rtree_leaf_elm_lookup(tsdn, rtree, rtree_ctx, key, dependent, false); - if (!dependent && elm == NULL) { + /* ANDROID CHANGE: Bad pointers return NULL */ + /* if (!dependent && elm == NULL) { */ + if (elm == NULL) { + /* ANDROID END CHANGE */ return NULL; } assert(elm != NULL); @@ -417,7 +430,10 @@ rtree_extent_read(tsdn_t *tsdn, rtree_t *rtree, rtree_ctx_t *rtree_ctx, uintptr_t key, bool dependent) { rtree_leaf_elm_t *elm = rtree_read(tsdn, rtree, rtree_ctx, key, dependent); - if (!dependent && elm == NULL) { + /* ANDROID CHANGE: Bad pointers return NULL */ + /* if (!dependent && elm == NULL) { */ + if (elm == NULL) { + /* ANDROID END CHANGE */ return NULL; } return rtree_leaf_elm_extent_read(tsdn, rtree, elm, dependent); @@ -428,7 +444,9 @@ rtree_szind_read(tsdn_t *tsdn, rtree_t *rtree, rtree_ctx_t *rtree_ctx, uintptr_t key, bool dependent) { rtree_leaf_elm_t *elm = rtree_read(tsdn, rtree, rtree_ctx, key, dependent); - if (!dependent && elm == NULL) { + /* ANDROID CHANGE: Bad pointers return NULL */ + /* if (!dependent && elm == NULL) { */ + if (elm == NULL) { return NSIZES; } return rtree_leaf_elm_szind_read(tsdn, rtree, elm, dependent); @@ -444,7 +462,10 @@ rtree_extent_szind_read(tsdn_t *tsdn, rtree_t *rtree, rtree_ctx_t *rtree_ctx, uintptr_t key, bool dependent, extent_t **r_extent, szind_t *r_szind) { rtree_leaf_elm_t *elm = rtree_read(tsdn, rtree, rtree_ctx, key, dependent); - if (!dependent && elm == NULL) { + /* ANDROID CHANGE: Bad pointers return NULL */ + /* if (!dependent && elm == NULL) { */ + if (elm == NULL) { + /* ANDROID END CHANGE */ return true; } *r_extent = rtree_leaf_elm_extent_read(tsdn, rtree, elm, dependent); @@ -457,7 +478,10 @@ rtree_szind_slab_read(tsdn_t *tsdn, rtree_t *rtree, rtree_ctx_t *rtree_ctx, uintptr_t key, bool dependent, szind_t *r_szind, bool *r_slab) { rtree_leaf_elm_t *elm = rtree_read(tsdn, rtree, rtree_ctx, key, dependent); - if (!dependent && elm == NULL) { + /* ANDROID CHANGE: Bad pointers return NULL */ + /* if (!dependent && elm == NULL) { */ + if (elm == NULL) { + /* ANDROID END CHANGE */ return true; } #ifdef RTREE_LEAF_COMPACT diff --git a/include/jemalloc/jemalloc_rename.h b/include/jemalloc/jemalloc_rename.h index c5cefd8d..2784243e 100644 --- a/include/jemalloc/jemalloc_rename.h +++ b/include/jemalloc/jemalloc_rename.h @@ -4,7 +4,7 @@ * these macro definitions. */ #ifndef JEMALLOC_NO_RENAME -#if defined(__ANDROID__) +#if defined(__BIONIC__) # define je_aligned_alloc je_aligned_alloc # define je_calloc je_calloc # define je_dallocx je_dallocx -- cgit v1.2.3