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

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: Refactoring after Simon's comments 2 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 LeakDetectorController::TotalMemoryGrowthTracker::TotalMemoryGrowthTracker()
151 : total_usage_kb_(0) {
152 }
153
154 LeakDetectorController::TotalMemoryGrowthTracker::~TotalMemoryGrowthTracker() {
155 }
156
157 bool LeakDetectorController::TotalMemoryGrowthTracker::UpdateSample(
158 base::ProcessId pid, int sample, int* diff) {
159 total_usage_kb_ += sample;
160 return false;
161 }
162
148 LeakDetectorController::LeakDetectorController() 163 LeakDetectorController::LeakDetectorController()
149 : params_(GetLeakDetectorParams()), 164 : params_(GetLeakDetectorParams()),
150 browser_process_enable_probability_(0), 165 browser_process_enable_probability_(0),
151 renderer_process_enable_probability_(0), 166 renderer_process_enable_probability_(0),
152 max_renderer_processes_with_leak_detector_enabled_(0), 167 max_renderer_processes_with_leak_detector_enabled_(0),
153 num_renderer_processes_with_leak_detector_enabled_(0) { 168 num_renderer_processes_with_leak_detector_enabled_(0),
169 waiting_for_collect_memory_usage_(false),
170 weak_ptr_factory_(this) {
154 // Read the build ID once and store it. 171 // Read the build ID once and store it.
155 leak_detector::gnu_build_id_reader::ReadBuildID(&build_id_); 172 leak_detector::gnu_build_id_reader::ReadBuildID(&build_id_);
156 173
157 GetLeakDetectorEnableParams( 174 GetLeakDetectorEnableParams(
158 &browser_process_enable_probability_, 175 &browser_process_enable_probability_,
159 &renderer_process_enable_probability_, 176 &renderer_process_enable_probability_,
160 &max_renderer_processes_with_leak_detector_enabled_); 177 &max_renderer_processes_with_leak_detector_enabled_);
161 178
162 // Register the LeakDetectorController with the remote controller, so this 179 // Register the LeakDetectorController with the remote controller, so this
163 // class can send/receive data to/from remote processes. 180 // 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_; 231 --num_renderer_processes_with_leak_detector_enabled_;
215 } 232 }
216 233
217 bool LeakDetectorController::ShouldRandomlyEnableLeakDetectorOnRendererProcess() 234 bool LeakDetectorController::ShouldRandomlyEnableLeakDetectorOnRendererProcess()
218 const { 235 const {
219 return base::RandDouble() < renderer_process_enable_probability_ && 236 return base::RandDouble() < renderer_process_enable_probability_ &&
220 num_renderer_processes_with_leak_detector_enabled_ < 237 num_renderer_processes_with_leak_detector_enabled_ <
221 max_renderer_processes_with_leak_detector_enabled_; 238 max_renderer_processes_with_leak_detector_enabled_;
222 } 239 }
223 240
241 void LeakDetectorController::OnMemoryDetailCollectionDone(size_t index) {
242 DCHECK(thread_checker_.CalledOnValidThread());
243 DCHECK(waiting_for_collect_memory_usage_);
244 waiting_for_collect_memory_usage_ = false;
245
246 // The available physical memory must be translated from bytes
247 // and the total memory usage must be translated from kb.
248 MemoryLeakReportProto::MemoryUsageInfo mem_info;
249 mem_info.set_available_ram_mb(
250 base::SysInfo::AmountOfAvailablePhysicalMemory() / 1024 / 1024);
251 mem_info.set_chrome_ram_usage_mb(
252 total_memory_growth_tracker_.total_usage_kb() / 1024);
253
254 // Update all reports that arrived in the meantime.
255 for (; index < stored_reports_.size(); index++) {
256 stored_reports_[index].mutable_memory_usage_info()->CopyFrom(mem_info);
257 }
258 }
259
224 void LeakDetectorController::StoreLeakReports( 260 void LeakDetectorController::StoreLeakReports(
225 const std::vector<MemoryLeakReportProto>& reports, 261 const std::vector<MemoryLeakReportProto>& reports,
226 MemoryLeakReportProto::ProcessType process_type) { 262 MemoryLeakReportProto::ProcessType process_type) {
227 DCHECK(thread_checker_.CalledOnValidThread()); 263 DCHECK(thread_checker_.CalledOnValidThread());
228 264
265 // Postpone a task of collecting info about the memory usage.
266 // When the task is done, all reports collected after this point
267 // will be updated, unless GetLeakReports() gets called first.
268 if (!waiting_for_collect_memory_usage_) {
269 waiting_for_collect_memory_usage_ = true;
270
271 total_memory_growth_tracker_.reset();
272
273 // Idea of using MetricsMemoryDetails is the same as in
274 // ChromeMetricsServiceClient. As a side effect, the histogram
275 // data is generated.
276 base::Closure callback = base::Bind(
277 &LeakDetectorController::OnMemoryDetailCollectionDone,
278 weak_ptr_factory_.GetWeakPtr(), stored_reports_.size());
279
280 scoped_refptr<MetricsMemoryDetails> details(
281 new MetricsMemoryDetails(callback, &total_memory_growth_tracker_));
282 details->StartFetch();
mwlodar 2016/10/06 00:07:53 This method calls DCHECK(!BrowserThread::Currently
mwlodar 2016/10/07 06:05:38 This was fixed in patch set 6 by initializing wait
283 }
284
229 for (const auto& report : reports) { 285 for (const auto& report : reports) {
230 // Store the report and insert stored parameters. 286 // Store the report and insert stored parameters.
231 stored_reports_.push_back(report); 287 stored_reports_.push_back(report);
232 stored_reports_.back().mutable_params()->CopyFrom(params_); 288 stored_reports_.back().mutable_params()->CopyFrom(params_);
233 stored_reports_.back().set_source_process(process_type); 289 stored_reports_.back().set_source_process(process_type);
234 stored_reports_.back().mutable_build_id()->assign(build_id_.begin(), 290 stored_reports_.back().mutable_build_id()->assign(build_id_.begin(),
235 build_id_.end()); 291 build_id_.end());
236 } 292 }
237 } 293 }
238 294
239 } // namespace metrics 295 } // namespace metrics
OLDNEW
« no previous file with comments | « chrome/browser/metrics/leak_detector/leak_detector_controller.h ('k') | chrome/browser/metrics/metrics_memory_details.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698