diff options
author | Josh Gao <jmgao@google.com> | 2017-02-16 23:11:51 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2017-02-16 23:11:52 +0000 |
commit | 4509e0ec94b6310d13b9f06a122ec66acb224a10 (patch) | |
tree | 230961212a119ac9a07e30e9d668d4deaf883208 /linker/linker_memory.cpp | |
parent | fec0e015ce0369b3ad710547f3d6af343b2cd5e1 (diff) | |
parent | ec0dbc3782c009329a6cbe9013d34c4423fc0f3b (diff) |
Merge changes from topic 'debuggerd_inproc'
* changes:
linker: use fallback crash handler dumping.
linker: add android_use_fallback_allocator.
Diffstat (limited to 'linker/linker_memory.cpp')
-rw-r--r-- | linker/linker_memory.cpp | 37 |
1 files changed, 33 insertions, 4 deletions
diff --git a/linker/linker_memory.cpp b/linker/linker_memory.cpp index 3920e8cc9..18ef93e9d 100644 --- a/linker/linker_memory.cpp +++ b/linker/linker_memory.cpp @@ -29,22 +29,51 @@ #include "linker_allocator.h" #include <stdlib.h> +#include <sys/cdefs.h> +#include <unistd.h> + +#include "private/libc_logging.h" static LinkerMemoryAllocator g_linker_allocator; +static pid_t fallback_tid = 0; + +// Used by libdebuggerd_handler to switch allocators during a crash dump, in +// case the linker heap is corrupted. Do not use this function. +extern "C" void __linker_use_fallback_allocator() { + if (fallback_tid != 0) { + __libc_format_log(ANDROID_LOG_ERROR, "libc", + "attempted to set fallback allocator multiple times"); + return; + } + + fallback_tid = gettid(); +} + +static LinkerMemoryAllocator& get_fallback_allocator() { + static LinkerMemoryAllocator fallback_allocator; + return fallback_allocator; +} + +static LinkerMemoryAllocator& get_allocator() { + if (__predict_false(fallback_tid) && __predict_false(gettid() == fallback_tid)) { + return get_fallback_allocator(); + } + return g_linker_allocator; +} void* malloc(size_t byte_count) { - return g_linker_allocator.alloc(byte_count); + return get_allocator().alloc(byte_count); } void* calloc(size_t item_count, size_t item_size) { - return g_linker_allocator.alloc(item_count*item_size); + return get_allocator().alloc(item_count*item_size); } void* realloc(void* p, size_t byte_count) { - return g_linker_allocator.realloc(p, byte_count); + return get_allocator().realloc(p, byte_count); } void free(void* ptr) { - g_linker_allocator.free(ptr); + get_allocator().free(ptr); } |