1*8d67ca89SAndroid Build Coastguard Worker /*
2*8d67ca89SAndroid Build Coastguard Worker * Copyright (C) 2015 The Android Open Source Project
3*8d67ca89SAndroid Build Coastguard Worker * All rights reserved.
4*8d67ca89SAndroid Build Coastguard Worker *
5*8d67ca89SAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without
6*8d67ca89SAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions
7*8d67ca89SAndroid Build Coastguard Worker * are met:
8*8d67ca89SAndroid Build Coastguard Worker * * Redistributions of source code must retain the above copyright
9*8d67ca89SAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer.
10*8d67ca89SAndroid Build Coastguard Worker * * Redistributions in binary form must reproduce the above copyright
11*8d67ca89SAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer in
12*8d67ca89SAndroid Build Coastguard Worker * the documentation and/or other materials provided with the
13*8d67ca89SAndroid Build Coastguard Worker * distribution.
14*8d67ca89SAndroid Build Coastguard Worker *
15*8d67ca89SAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16*8d67ca89SAndroid Build Coastguard Worker * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17*8d67ca89SAndroid Build Coastguard Worker * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
18*8d67ca89SAndroid Build Coastguard Worker * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
19*8d67ca89SAndroid Build Coastguard Worker * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
20*8d67ca89SAndroid Build Coastguard Worker * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21*8d67ca89SAndroid Build Coastguard Worker * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
22*8d67ca89SAndroid Build Coastguard Worker * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23*8d67ca89SAndroid Build Coastguard Worker * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24*8d67ca89SAndroid Build Coastguard Worker * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
25*8d67ca89SAndroid Build Coastguard Worker * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26*8d67ca89SAndroid Build Coastguard Worker * SUCH DAMAGE.
27*8d67ca89SAndroid Build Coastguard Worker */
28*8d67ca89SAndroid Build Coastguard Worker
29*8d67ca89SAndroid Build Coastguard Worker #include <stdint.h>
30*8d67ca89SAndroid Build Coastguard Worker
31*8d67ca89SAndroid Build Coastguard Worker #include "Config.h"
32*8d67ca89SAndroid Build Coastguard Worker #include "DebugData.h"
33*8d67ca89SAndroid Build Coastguard Worker #include "GuardData.h"
34*8d67ca89SAndroid Build Coastguard Worker #include "LogAllocatorStats.h"
35*8d67ca89SAndroid Build Coastguard Worker #include "PointerData.h"
36*8d67ca89SAndroid Build Coastguard Worker #include "debug_disable.h"
37*8d67ca89SAndroid Build Coastguard Worker #include "malloc_debug.h"
38*8d67ca89SAndroid Build Coastguard Worker
Initialize(const char * options)39*8d67ca89SAndroid Build Coastguard Worker bool DebugData::Initialize(const char* options) {
40*8d67ca89SAndroid Build Coastguard Worker if (!config_.Init(options)) {
41*8d67ca89SAndroid Build Coastguard Worker return false;
42*8d67ca89SAndroid Build Coastguard Worker }
43*8d67ca89SAndroid Build Coastguard Worker
44*8d67ca89SAndroid Build Coastguard Worker // Check to see if the options that require a header are enabled.
45*8d67ca89SAndroid Build Coastguard Worker if (config_.options() & HEADER_OPTIONS) {
46*8d67ca89SAndroid Build Coastguard Worker // Initialize all of the static header offsets.
47*8d67ca89SAndroid Build Coastguard Worker pointer_offset_ = __BIONIC_ALIGN(sizeof(Header), MINIMUM_ALIGNMENT_BYTES);
48*8d67ca89SAndroid Build Coastguard Worker
49*8d67ca89SAndroid Build Coastguard Worker if (config_.options() & FRONT_GUARD) {
50*8d67ca89SAndroid Build Coastguard Worker front_guard.reset(new FrontGuardData(this, config_, &pointer_offset_));
51*8d67ca89SAndroid Build Coastguard Worker }
52*8d67ca89SAndroid Build Coastguard Worker
53*8d67ca89SAndroid Build Coastguard Worker extra_bytes_ = pointer_offset_;
54*8d67ca89SAndroid Build Coastguard Worker
55*8d67ca89SAndroid Build Coastguard Worker // Initialize all of the non-header data.
56*8d67ca89SAndroid Build Coastguard Worker if (config_.options() & REAR_GUARD) {
57*8d67ca89SAndroid Build Coastguard Worker rear_guard.reset(new RearGuardData(this, config_));
58*8d67ca89SAndroid Build Coastguard Worker extra_bytes_ += config_.rear_guard_bytes();
59*8d67ca89SAndroid Build Coastguard Worker }
60*8d67ca89SAndroid Build Coastguard Worker }
61*8d67ca89SAndroid Build Coastguard Worker
62*8d67ca89SAndroid Build Coastguard Worker if (TrackPointers()) {
63*8d67ca89SAndroid Build Coastguard Worker pointer.reset(new PointerData(this));
64*8d67ca89SAndroid Build Coastguard Worker if (!pointer->Initialize(config_)) {
65*8d67ca89SAndroid Build Coastguard Worker return false;
66*8d67ca89SAndroid Build Coastguard Worker }
67*8d67ca89SAndroid Build Coastguard Worker }
68*8d67ca89SAndroid Build Coastguard Worker
69*8d67ca89SAndroid Build Coastguard Worker if (config_.options() & RECORD_ALLOCS) {
70*8d67ca89SAndroid Build Coastguard Worker record.reset(new RecordData());
71*8d67ca89SAndroid Build Coastguard Worker if (!record->Initialize(config_)) {
72*8d67ca89SAndroid Build Coastguard Worker return false;
73*8d67ca89SAndroid Build Coastguard Worker }
74*8d67ca89SAndroid Build Coastguard Worker }
75*8d67ca89SAndroid Build Coastguard Worker
76*8d67ca89SAndroid Build Coastguard Worker if (config_.options() & EXPAND_ALLOC) {
77*8d67ca89SAndroid Build Coastguard Worker extra_bytes_ += config_.expand_alloc_bytes();
78*8d67ca89SAndroid Build Coastguard Worker }
79*8d67ca89SAndroid Build Coastguard Worker
80*8d67ca89SAndroid Build Coastguard Worker if (config_.options() & LOG_ALLOCATOR_STATS_ON_SIGNAL) {
81*8d67ca89SAndroid Build Coastguard Worker if (!LogAllocatorStats::Initialize(config_)) {
82*8d67ca89SAndroid Build Coastguard Worker return false;
83*8d67ca89SAndroid Build Coastguard Worker }
84*8d67ca89SAndroid Build Coastguard Worker }
85*8d67ca89SAndroid Build Coastguard Worker
86*8d67ca89SAndroid Build Coastguard Worker return true;
87*8d67ca89SAndroid Build Coastguard Worker }
88*8d67ca89SAndroid Build Coastguard Worker
PrepareFork()89*8d67ca89SAndroid Build Coastguard Worker void DebugData::PrepareFork() {
90*8d67ca89SAndroid Build Coastguard Worker if (pointer != nullptr) {
91*8d67ca89SAndroid Build Coastguard Worker pointer->PrepareFork();
92*8d67ca89SAndroid Build Coastguard Worker }
93*8d67ca89SAndroid Build Coastguard Worker }
94*8d67ca89SAndroid Build Coastguard Worker
PostForkParent()95*8d67ca89SAndroid Build Coastguard Worker void DebugData::PostForkParent() {
96*8d67ca89SAndroid Build Coastguard Worker if (pointer != nullptr) {
97*8d67ca89SAndroid Build Coastguard Worker pointer->PostForkParent();
98*8d67ca89SAndroid Build Coastguard Worker }
99*8d67ca89SAndroid Build Coastguard Worker }
100*8d67ca89SAndroid Build Coastguard Worker
PostForkChild()101*8d67ca89SAndroid Build Coastguard Worker void DebugData::PostForkChild() {
102*8d67ca89SAndroid Build Coastguard Worker if (pointer != nullptr) {
103*8d67ca89SAndroid Build Coastguard Worker pointer->PostForkChild();
104*8d67ca89SAndroid Build Coastguard Worker }
105*8d67ca89SAndroid Build Coastguard Worker }
106