diff options
author | Rickard Green <[email protected]> | 2015-11-12 15:44:56 +0100 |
---|---|---|
committer | Rickard Green <[email protected]> | 2015-11-12 15:44:56 +0100 |
commit | ef72a791f4dc9a1816ac8ff95a612409b86de818 (patch) | |
tree | 495fd4968a7794cb150754cf1acf3c6b79dc7d30 /erts/emulator/beam/erl_alloc.h | |
parent | 0a4d4450d2143ca824644c6da96f98fc95811e3e (diff) | |
parent | 7858ca939f8bf2db918396616fee13364d150a1e (diff) | |
download | otp-ef72a791f4dc9a1816ac8ff95a612409b86de818.tar.gz otp-ef72a791f4dc9a1816ac8ff95a612409b86de818.tar.bz2 otp-ef72a791f4dc9a1816ac8ff95a612409b86de818.zip |
Merge branch 'sverk/literal-memory-range'
* sverk/literal-memory-range:
erts: Refactor line table in loaded beam code
erts: Refactor header of loaded beam code
fix check_process_code for separate literal area
erts: Add support for fast erts_is_literal()
erts: Refactor erl_mmap to allow several mapper instances
erts: Add new allocator LITERAL
erts: Fix strangeness in treatment of MSEG_ALIGN_BITS
erts: Cleanup main carrier creation
erts: Remove unused erts_have_erts_mmap
erts: Refactor config test for posix_memalign
Diffstat (limited to 'erts/emulator/beam/erl_alloc.h')
-rw-r--r-- | erts/emulator/beam/erl_alloc.h | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/erts/emulator/beam/erl_alloc.h b/erts/emulator/beam/erl_alloc.h index f540bae20d..a0d8561e84 100644 --- a/erts/emulator/beam/erl_alloc.h +++ b/erts/emulator/beam/erl_alloc.h @@ -30,6 +30,7 @@ #ifdef USE_THREADS #include "erl_threads.h" #endif +#include "erl_mmap.h" #ifdef DEBUG # undef ERTS_ALC_WANT_INLINE @@ -204,6 +205,7 @@ void erts_free(ErtsAlcType_t type, void *ptr); void *erts_alloc_fnf(ErtsAlcType_t type, Uint size); void *erts_realloc_fnf(ErtsAlcType_t type, void *ptr, Uint size); int erts_is_allctr_wrapper_prelocked(void); +int erts_is_literal(void* ptr); #endif /* #if !ERTS_ALC_DO_INLINE */ @@ -281,6 +283,28 @@ int erts_is_allctr_wrapper_prelocked(void) && !!erts_tsd_get(erts_allctr_prelock_tsd_key); /* by me */ } +ERTS_ALC_INLINE +int erts_is_literal(void* ptr) +{ +#if defined(ARCH_32) + Uint ix = (UWord)ptr >> ERTS_MMAP_SUPERALIGNED_BITS; + + return erts_literal_vspace_map[ix / ERTS_VSPACE_WORD_BITS] + & ((UWord)1 << (ix % ERTS_VSPACE_WORD_BITS)); + +#elif defined(ARCH_64) +# if defined(ERTS_HAVE_OS_PHYSICAL_MEMORY_RESERVATION) + extern char* erts_literals_start; + extern UWord erts_literals_size; + return ErtsInArea(ptr, erts_literals_start, erts_literals_size); +# else +# error Do the tag thing +# endif +#else +# error No ARCH_xx +#endif +} + #endif /* #if ERTS_ALC_DO_INLINE || defined(ERTS_ALC_INTERNAL__) */ #define ERTS_ALC_GET_THR_IX() ((int) erts_get_scheduler_id()) |