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

Side by Side Diff: chrome/browser/metrics/leak_detector/leak_detector_controller.cc

Issue 2396743002: Leak reports collect information about the memory usage (Closed)
Patch Set: Fixed order of initialization Created 4 years, 2 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 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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 "chrome/browser/metrics/leak_detector/leak_detector_controller.h" 5 #include "chrome/browser/metrics/leak_detector/leak_detector_controller.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/memory/weak_ptr.h"
10 #include "base/rand_util.h" 11 #include "base/rand_util.h"
11 #include "base/strings/string_number_conversions.h" 12 #include "base/strings/string_number_conversions.h"
13 #include "base/sys_info.h"
12 #include "components/metrics/leak_detector/gnu_build_id_reader.h" 14 #include "components/metrics/leak_detector/gnu_build_id_reader.h"
13 #include "components/variations/variations_associated_data.h" 15 #include "components/variations/variations_associated_data.h"
14 #include "content/public/browser/browser_thread.h" 16 #include "content/public/browser/browser_thread.h"
15 17
16 namespace metrics { 18 namespace metrics {
17 19
18 namespace { 20 namespace {
19 21
20 using ParamsMap = std::map<std::string, std::string>; 22 using ParamsMap = std::map<std::string, std::string>;
21 23
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
138 } 140 }
139 iter = params.find(kMaxRendererProcessesEnabledParam); 141 iter = params.find(kMaxRendererProcessesEnabledParam);
140 if (iter == params.end() || 142 if (iter == params.end() ||
141 !base::StringToInt(iter->second, max_renderer_processes_enabled)) { 143 !base::StringToInt(iter->second, max_renderer_processes_enabled)) {
142 *max_renderer_processes_enabled = kDefaultNumProcessesEnabled; 144 *max_renderer_processes_enabled = kDefaultNumProcessesEnabled;
143 } 145 }
144 } 146 }
145 147
146 } // namespace 148 } // namespace
147 149
150 TotalMemoryGrowthTracker::TotalMemoryGrowthTracker() : total_usage_kb_(0) {
151 }
152
153 TotalMemoryGrowthTracker::~TotalMemoryGrowthTracker() {
154 }
155
156 bool TotalMemoryGrowthTracker::UpdateSample(
157 base::ProcessId pid, int sample, int* diff) {
158 total_usage_kb_ += sample;
159 return false;
160 }
161
162 size_t TotalMemoryGrowthTracker::GetTotalUsageKb() const {
Simon Que 2016/10/05 22:12:43 This can be inlined, and renamed to total_usage_kb
mwlodar 2016/10/06 00:07:53 Done.
163 return total_usage_kb_;
164 }
165
166 void TotalMemoryGrowthTracker::Reset() {
Simon Que 2016/10/05 22:12:43 Same here.
mwlodar 2016/10/06 00:07:53 Done.
167 total_usage_kb_ = 0;
168 }
169
148 LeakDetectorController::LeakDetectorController() 170 LeakDetectorController::LeakDetectorController()
149 : params_(GetLeakDetectorParams()), 171 : params_(GetLeakDetectorParams()),
150 browser_process_enable_probability_(0), 172 browser_process_enable_probability_(0),
151 renderer_process_enable_probability_(0), 173 renderer_process_enable_probability_(0),
152 max_renderer_processes_with_leak_detector_enabled_(0), 174 max_renderer_processes_with_leak_detector_enabled_(0),
153 num_renderer_processes_with_leak_detector_enabled_(0) { 175 num_renderer_processes_with_leak_detector_enabled_(0),
176 waiting_for_collect_memory_usage_(false),
177 weak_ptr_factory_(this) {
154 // Read the build ID once and store it. 178 // Read the build ID once and store it.
155 leak_detector::gnu_build_id_reader::ReadBuildID(&build_id_); 179 leak_detector::gnu_build_id_reader::ReadBuildID(&build_id_);
156 180
157 GetLeakDetectorEnableParams( 181 GetLeakDetectorEnableParams(
158 &browser_process_enable_probability_, 182 &browser_process_enable_probability_,
159 &renderer_process_enable_probability_, 183 &renderer_process_enable_probability_,
160 &max_renderer_processes_with_leak_detector_enabled_); 184 &max_renderer_processes_with_leak_detector_enabled_);
161 185
162 // Register the LeakDetectorController with the remote controller, so this 186 // Register the LeakDetectorController with the remote controller, so this
163 // class can send/receive data to/from remote processes. 187 // class can send/receive data to/from remote processes.
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
214 --num_renderer_processes_with_leak_detector_enabled_; 238 --num_renderer_processes_with_leak_detector_enabled_;
215 } 239 }
216 240
217 bool LeakDetectorController::ShouldRandomlyEnableLeakDetectorOnRendererProcess() 241 bool LeakDetectorController::ShouldRandomlyEnableLeakDetectorOnRendererProcess()
218 const { 242 const {
219 return base::RandDouble() < renderer_process_enable_probability_ && 243 return base::RandDouble() < renderer_process_enable_probability_ &&
220 num_renderer_processes_with_leak_detector_enabled_ < 244 num_renderer_processes_with_leak_detector_enabled_ <
221 max_renderer_processes_with_leak_detector_enabled_; 245 max_renderer_processes_with_leak_detector_enabled_;
222 } 246 }
223 247
248 void LeakDetectorController::OnMemoryDetailCollectionDone(size_t index) {
249 DCHECK(thread_checker_.CalledOnValidThread());
250 DCHECK(waiting_for_collect_memory_usage_);
251 waiting_for_collect_memory_usage_ = false;
252
253 // The available physical memory must be translated from bytes
254 // and the total memory usage must be translated from kb.
255 MemoryLeakReportProto::MemoryUsageInfo mem_info;
256 mem_info.set_available_ram_mb(
257 base::SysInfo::AmountOfAvailablePhysicalMemory() / 1024 / 1024);
258 mem_info.set_chrome_ram_usage_mb(
259 total_memory_growth_tracker_.GetTotalUsageKb() / 1024);
260
261 // Update all reports that arrived in the meantime.
262 for (; index < stored_reports_.size(); index++) {
263 stored_reports_[index].mutable_memory_usage_info()->CopyFrom(mem_info);
Simon Que 2016/10/05 22:12:43 You could be overwriting mem info in previously st
mwlodar 2016/10/06 00:07:53 We have talked about this. No fix needed.
264 }
265 }
266
224 void LeakDetectorController::StoreLeakReports( 267 void LeakDetectorController::StoreLeakReports(
225 const std::vector<MemoryLeakReportProto>& reports, 268 const std::vector<MemoryLeakReportProto>& reports,
226 MemoryLeakReportProto::ProcessType process_type) { 269 MemoryLeakReportProto::ProcessType process_type) {
227 DCHECK(thread_checker_.CalledOnValidThread()); 270 DCHECK(thread_checker_.CalledOnValidThread());
228 271
272 // Postpone a task of collecting info about the memory usage.
273 // When the task is done, all reports collected after this point
274 // will be updated, unless GetLeakReports() gets called first.
275 if (!waiting_for_collect_memory_usage_) {
276 waiting_for_collect_memory_usage_ = true;
277
278 total_memory_growth_tracker_.Reset();
279
280 // Idea of using MetricsMemoryDetails is the same as in
281 // ChromeMetricsServiceClient. As a side effect, the histogram
282 // data is generated.
283 base::Closure callback = base::Bind(
284 &LeakDetectorController::OnMemoryDetailCollectionDone,
285 weak_ptr_factory_.GetWeakPtr(), stored_reports_.size());
286
287 scoped_refptr<MetricsMemoryDetails> details(
288 new MetricsMemoryDetails(callback, &total_memory_growth_tracker_));
289 details->StartFetch();
290 }
291
229 for (const auto& report : reports) { 292 for (const auto& report : reports) {
230 // Store the report and insert stored parameters. 293 // Store the report and insert stored parameters.
231 stored_reports_.push_back(report); 294 stored_reports_.push_back(report);
232 stored_reports_.back().mutable_params()->CopyFrom(params_); 295 stored_reports_.back().mutable_params()->CopyFrom(params_);
233 stored_reports_.back().set_source_process(process_type); 296 stored_reports_.back().set_source_process(process_type);
234 stored_reports_.back().mutable_build_id()->assign(build_id_.begin(), 297 stored_reports_.back().mutable_build_id()->assign(build_id_.begin(),
235 build_id_.end()); 298 build_id_.end());
236 } 299 }
237 } 300 }
238 301
239 } // namespace metrics 302 } // namespace metrics
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698