dlmalloc.cc revision 1d54e73444e017d3a65234e0f193846f3e27472b
115bf2d34efa2218e287b584fb3653d268b9edc8dIan Rogers/* 215bf2d34efa2218e287b584fb3653d268b9edc8dIan Rogers * Copyright (C) 2012 The Android Open Source Project 315bf2d34efa2218e287b584fb3653d268b9edc8dIan Rogers * 415bf2d34efa2218e287b584fb3653d268b9edc8dIan Rogers * Licensed under the Apache License, Version 2.0 (the "License"); 515bf2d34efa2218e287b584fb3653d268b9edc8dIan Rogers * you may not use this file except in compliance with the License. 615bf2d34efa2218e287b584fb3653d268b9edc8dIan Rogers * You may obtain a copy of the License at 715bf2d34efa2218e287b584fb3653d268b9edc8dIan Rogers * 815bf2d34efa2218e287b584fb3653d268b9edc8dIan Rogers * http://www.apache.org/licenses/LICENSE-2.0 915bf2d34efa2218e287b584fb3653d268b9edc8dIan Rogers * 1015bf2d34efa2218e287b584fb3653d268b9edc8dIan Rogers * Unless required by applicable law or agreed to in writing, software 1115bf2d34efa2218e287b584fb3653d268b9edc8dIan Rogers * distributed under the License is distributed on an "AS IS" BASIS, 1215bf2d34efa2218e287b584fb3653d268b9edc8dIan Rogers * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1315bf2d34efa2218e287b584fb3653d268b9edc8dIan Rogers * See the License for the specific language governing permissions and 1415bf2d34efa2218e287b584fb3653d268b9edc8dIan Rogers * limitations under the License. 1515bf2d34efa2218e287b584fb3653d268b9edc8dIan Rogers */ 1615bf2d34efa2218e287b584fb3653d268b9edc8dIan Rogers 1715bf2d34efa2218e287b584fb3653d268b9edc8dIan Rogers#include "dlmalloc.h" 1815bf2d34efa2218e287b584fb3653d268b9edc8dIan Rogers 1907ed66b5ae659c452cbe1ab20c3dbf1d6f546461Elliott Hughes#include "base/logging.h" 2015bf2d34efa2218e287b584fb3653d268b9edc8dIan Rogers 2115bf2d34efa2218e287b584fb3653d268b9edc8dIan Rogers// ART specific morecore implementation defined in space.cc. 2215bf2d34efa2218e287b584fb3653d268b9edc8dIan Rogers#define MORECORE(x) art_heap_morecore(m, x) 2315bf2d34efa2218e287b584fb3653d268b9edc8dIan Rogersextern "C" void* art_heap_morecore(void* m, intptr_t increment); 2415bf2d34efa2218e287b584fb3653d268b9edc8dIan Rogers 2515bf2d34efa2218e287b584fb3653d268b9edc8dIan Rogers// Custom heap error handling. 2615bf2d34efa2218e287b584fb3653d268b9edc8dIan Rogers#define PROCEED_ON_ERROR 0 2715bf2d34efa2218e287b584fb3653d268b9edc8dIan Rogersstatic void art_heap_corruption(const char* function); 2815bf2d34efa2218e287b584fb3653d268b9edc8dIan Rogersstatic void art_heap_usage_error(const char* function, void* p); 2915bf2d34efa2218e287b584fb3653d268b9edc8dIan Rogers#define CORRUPTION_ERROR_ACTION(m) art_heap_corruption(__FUNCTION__) 3015bf2d34efa2218e287b584fb3653d268b9edc8dIan Rogers#define USAGE_ERROR_ACTION(m,p) art_heap_usage_error(__FUNCTION__, p) 3115bf2d34efa2218e287b584fb3653d268b9edc8dIan Rogers 3215bf2d34efa2218e287b584fb3653d268b9edc8dIan Rogers// Ugly inclusion of C file so that ART specific #defines configure dlmalloc for our use for 3315bf2d34efa2218e287b584fb3653d268b9edc8dIan Rogers// mspaces (regular dlmalloc is still declared in bionic). 3415bf2d34efa2218e287b584fb3653d268b9edc8dIan Rogers#pragma GCC diagnostic ignored "-Wempty-body" 3515bf2d34efa2218e287b584fb3653d268b9edc8dIan Rogers#pragma GCC diagnostic ignored "-Wstrict-aliasing" 3615bf2d34efa2218e287b584fb3653d268b9edc8dIan Rogers#include "../../../bionic/libc/upstream-dlmalloc/malloc.c" 3715bf2d34efa2218e287b584fb3653d268b9edc8dIan Rogers#pragma GCC diagnostic warning "-Wstrict-aliasing" 3815bf2d34efa2218e287b584fb3653d268b9edc8dIan Rogers#pragma GCC diagnostic warning "-Wempty-body" 3915bf2d34efa2218e287b584fb3653d268b9edc8dIan Rogers 4015bf2d34efa2218e287b584fb3653d268b9edc8dIan Rogers 4115bf2d34efa2218e287b584fb3653d268b9edc8dIan Rogersstatic void art_heap_corruption(const char* function) { 4215bf2d34efa2218e287b584fb3653d268b9edc8dIan Rogers LOG(FATAL) << "Corrupt heap detected in: " << function; 4315bf2d34efa2218e287b584fb3653d268b9edc8dIan Rogers} 4415bf2d34efa2218e287b584fb3653d268b9edc8dIan Rogers 4515bf2d34efa2218e287b584fb3653d268b9edc8dIan Rogersstatic void art_heap_usage_error(const char* function, void* p) { 4615bf2d34efa2218e287b584fb3653d268b9edc8dIan Rogers LOG(FATAL) << "Incorrect use of function '" << function << "' argument " << p << " not expected"; 4715bf2d34efa2218e287b584fb3653d268b9edc8dIan Rogers} 481d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 491d54e73444e017d3a65234e0f193846f3e27472bIan Rogers#include "globals.h" 501d54e73444e017d3a65234e0f193846f3e27472bIan Rogers#include "utils.h" 511d54e73444e017d3a65234e0f193846f3e27472bIan Rogers#include <sys/mman.h> 521d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 531d54e73444e017d3a65234e0f193846f3e27472bIan Rogersusing namespace art; 541d54e73444e017d3a65234e0f193846f3e27472bIan Rogersextern "C" void DlmallocMadviseCallback(void* start, void* end, size_t used_bytes, void* arg) { 551d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Is this chunk in use? 561d54e73444e017d3a65234e0f193846f3e27472bIan Rogers if (used_bytes != 0) { 571d54e73444e017d3a65234e0f193846f3e27472bIan Rogers return; 581d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 591d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Do we have any whole pages to give back? 601d54e73444e017d3a65234e0f193846f3e27472bIan Rogers start = reinterpret_cast<void*>(RoundUp(reinterpret_cast<uintptr_t>(start), kPageSize)); 611d54e73444e017d3a65234e0f193846f3e27472bIan Rogers end = reinterpret_cast<void*>(RoundDown(reinterpret_cast<uintptr_t>(end), kPageSize)); 621d54e73444e017d3a65234e0f193846f3e27472bIan Rogers if (end > start) { 631d54e73444e017d3a65234e0f193846f3e27472bIan Rogers size_t length = reinterpret_cast<byte*>(end) - reinterpret_cast<byte*>(start); 641d54e73444e017d3a65234e0f193846f3e27472bIan Rogers int rc = madvise(start, length, MADV_DONTNEED); 651d54e73444e017d3a65234e0f193846f3e27472bIan Rogers if (UNLIKELY(rc != 0)) { 661d54e73444e017d3a65234e0f193846f3e27472bIan Rogers errno = rc; 671d54e73444e017d3a65234e0f193846f3e27472bIan Rogers PLOG(FATAL) << "madvise failed during heap trimming"; 681d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 691d54e73444e017d3a65234e0f193846f3e27472bIan Rogers size_t* reclaimed = reinterpret_cast<size_t*>(arg); 701d54e73444e017d3a65234e0f193846f3e27472bIan Rogers *reclaimed += length; 711d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 721d54e73444e017d3a65234e0f193846f3e27472bIan Rogers} 73