/* * Copyright (C) 2015 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "linker_allocator.h" #include #include #include #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 get_allocator().alloc(byte_count); } void* calloc(size_t item_count, size_t item_size) { return get_allocator().alloc(item_count*item_size); } void* realloc(void* p, size_t byte_count) { return get_allocator().realloc(p, byte_count); } void free(void* ptr) { get_allocator().free(ptr); }