Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(41)

Side by Side Diff: base/trace_event/heap_profiler_allocation_register.cc

Issue 2784783003: On heap tracking datastructure overflow, degrade instead of CHECK() (Closed)
Patch Set: Address comments. Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/trace_event/heap_profiler_allocation_register.h" 5 #include "base/trace_event/heap_profiler_allocation_register.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/trace_event/trace_event_memory_overhead.h" 9 #include "base/trace_event/trace_event_memory_overhead.h"
10 10
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
74 : AllocationRegister(kAllocationCapacity, kBacktraceCapacity) {} 74 : AllocationRegister(kAllocationCapacity, kBacktraceCapacity) {}
75 75
76 AllocationRegister::AllocationRegister(size_t allocation_capacity, 76 AllocationRegister::AllocationRegister(size_t allocation_capacity,
77 size_t backtrace_capacity) 77 size_t backtrace_capacity)
78 : allocations_(allocation_capacity), 78 : allocations_(allocation_capacity),
79 backtraces_(backtrace_capacity) {} 79 backtraces_(backtrace_capacity) {}
80 80
81 AllocationRegister::~AllocationRegister() { 81 AllocationRegister::~AllocationRegister() {
82 } 82 }
83 83
84 void AllocationRegister::Insert(const void* address, 84 bool AllocationRegister::Insert(const void* address,
85 size_t size, 85 size_t size,
86 const AllocationContext& context) { 86 const AllocationContext& context) {
87 DCHECK(address != nullptr); 87 DCHECK(address != nullptr);
88 if (size == 0) { 88 if (size == 0) {
89 return; 89 return false;
90 } 90 }
91 91
92 AllocationInfo info = { 92 AllocationInfo info = {
93 size, 93 size,
94 context.type_name, 94 context.type_name,
95 InsertBacktrace(context.backtrace) 95 InsertBacktrace(context.backtrace)
96 }; 96 };
97 97
98 // Try to insert the allocation. 98 // Try to insert the allocation.
99 auto index_and_flag = allocations_.Insert(address, info); 99 auto index_and_flag = allocations_.Insert(address, info);
100 if (!index_and_flag.second) { 100 if (!index_and_flag.second &&
101 index_and_flag.first != AllocationMap::kInvalidKVIndex) {
101 // |address| is already there - overwrite the allocation info. 102 // |address| is already there - overwrite the allocation info.
102 auto& old_info = allocations_.Get(index_and_flag.first).second; 103 auto& old_info = allocations_.Get(index_and_flag.first).second;
103 RemoveBacktrace(old_info.backtrace_index); 104 RemoveBacktrace(old_info.backtrace_index);
104 old_info = info; 105 old_info = info;
105 } 106 }
Primiano Tucci (use gerrit) 2017/03/31 19:05:47 minor thing, but this branch should return true,
107
108 return index_and_flag.second;
106 } 109 }
107 110
108 void AllocationRegister::Remove(const void* address) { 111 void AllocationRegister::Remove(const void* address) {
109 auto index = allocations_.Find(address); 112 auto index = allocations_.Find(address);
110 if (index == AllocationMap::kInvalidKVIndex) { 113 if (index == AllocationMap::kInvalidKVIndex) {
111 return; 114 return;
112 } 115 }
113 116
114 const AllocationInfo& info = allocations_.Get(index).second; 117 const AllocationInfo& info = allocations_.Get(index).second;
115 RemoveBacktrace(info.backtrace_index); 118 RemoveBacktrace(info.backtrace_index);
(...skipping 26 matching lines...) Expand all
142 size_t allocated = sizeof(AllocationRegister); 145 size_t allocated = sizeof(AllocationRegister);
143 size_t resident = sizeof(AllocationRegister) 146 size_t resident = sizeof(AllocationRegister)
144 + allocations_.EstimateUsedMemory() 147 + allocations_.EstimateUsedMemory()
145 + backtraces_.EstimateUsedMemory(); 148 + backtraces_.EstimateUsedMemory();
146 overhead->Add("AllocationRegister", allocated, resident); 149 overhead->Add("AllocationRegister", allocated, resident);
147 } 150 }
148 151
149 AllocationRegister::BacktraceMap::KVIndex AllocationRegister::InsertBacktrace( 152 AllocationRegister::BacktraceMap::KVIndex AllocationRegister::InsertBacktrace(
150 const Backtrace& backtrace) { 153 const Backtrace& backtrace) {
151 auto index = backtraces_.Insert(backtrace, 0).first; 154 auto index = backtraces_.Insert(backtrace, 0).first;
152 auto& backtrace_and_count = backtraces_.Get(index); 155 if (index != BacktraceMap::kInvalidKVIndex) {
153 backtrace_and_count.second++; 156 auto& backtrace_and_count = backtraces_.Get(index);
157 backtrace_and_count.second++;
158 }
154 return index; 159 return index;
155 } 160 }
156 161
157 void AllocationRegister::RemoveBacktrace(BacktraceMap::KVIndex index) { 162 void AllocationRegister::RemoveBacktrace(BacktraceMap::KVIndex index) {
158 auto& backtrace_and_count = backtraces_.Get(index); 163 auto& backtrace_and_count = backtraces_.Get(index);
Primiano Tucci (use gerrit) 2017/03/31 19:05:47 I think now you created a bug here. If you run out
159 if (--backtrace_and_count.second == 0) { 164 if (--backtrace_and_count.second == 0) {
160 // Backtrace is not referenced anymore - remove it. 165 // Backtrace is not referenced anymore - remove it.
161 backtraces_.Remove(index); 166 backtraces_.Remove(index);
162 } 167 }
163 } 168 }
164 169
165 AllocationRegister::Allocation AllocationRegister::GetAllocation( 170 AllocationRegister::Allocation AllocationRegister::GetAllocation(
166 AllocationMap::KVIndex index) const { 171 AllocationMap::KVIndex index) const {
167 const auto& address_and_info = allocations_.Get(index); 172 const auto& address_and_info = allocations_.Get(index);
168 const auto& backtrace_and_count = backtraces_.Get( 173 const auto& backtrace_and_count = backtraces_.Get(
169 address_and_info.second.backtrace_index); 174 address_and_info.second.backtrace_index);
170 return { 175 return {
171 address_and_info.first, 176 address_and_info.first,
172 address_and_info.second.size, 177 address_and_info.second.size,
173 AllocationContext( 178 AllocationContext(
174 backtrace_and_count.first, 179 backtrace_and_count.first,
175 address_and_info.second.type_name) 180 address_and_info.second.type_name)
176 }; 181 };
177 } 182 }
178 183
179 } // namespace trace_event 184 } // namespace trace_event
180 } // namespace base 185 } // namespace base
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698