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

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

Issue 1417003003: [tracing] Dump child processes' memory metrics in browser (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@web_cache2_base
Patch Set: Nits. Created 5 years, 1 month 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/process_memory_totals_dump_provider.h" 5 #include "base/trace_event/process_memory_totals_dump_provider.h"
6 6
7 #include "base/process/process_metrics.h" 7 #include "base/process/process_metrics.h"
8 #include "base/trace_event/process_memory_dump.h" 8 #include "base/trace_event/process_memory_dump.h"
9 #include "base/trace_event/process_memory_totals.h" 9 #include "base/trace_event/process_memory_totals.h"
10 10
11 #if defined(OS_LINUX) || defined(OS_ANDROID) 11 #if defined(OS_LINUX) || defined(OS_ANDROID)
12 #include <fcntl.h> 12 #include <fcntl.h>
13 13
14 #include "base/files/file_util.h" 14 #include "base/files/file_util.h"
15 15
16 namespace { 16 namespace {
17 bool kernel_supports_rss_peak_reset = true; 17 bool kernel_supports_rss_peak_reset = true;
18 const char kClearPeakRssCommand[] = "5"; 18 const char kClearPeakRssCommand[] = "5";
19 } 19 }
20 #endif 20 #endif
21 21
22 namespace base { 22 namespace base {
23 namespace trace_event { 23 namespace trace_event {
24 24
25 // static 25 // static
26 uint64 ProcessMemoryTotalsDumpProvider::rss_bytes_for_testing = 0; 26 uint64 ProcessMemoryTotalsDumpProvider::rss_bytes_for_testing = 0;
27 27
28 namespace { 28 namespace {
29 29
30 ProcessMetrics* CreateProcessMetricsForCurrentProcess() { 30 ProcessMetrics* CreateProcessMetrics(ProcessHandle process) {
31 #if !defined(OS_MACOSX) || defined(OS_IOS) 31 #if !defined(OS_MACOSX) || defined(OS_IOS)
32 return ProcessMetrics::CreateProcessMetrics(GetCurrentProcessHandle()); 32 return ProcessMetrics::CreateProcessMetrics(process);
33 #else 33 #else
34 return ProcessMetrics::CreateProcessMetrics(GetCurrentProcessHandle(), NULL); 34 return ProcessMetrics::CreateProcessMetrics(process, NULL);
35 #endif 35 #endif
36 } 36 }
37 } // namespace 37 } // namespace
38 38
39 // static 39 // static
40 ProcessMemoryTotalsDumpProvider* 40 scoped_ptr<ProcessMemoryTotalsDumpProvider>
41 ProcessMemoryTotalsDumpProvider::GetInstance() { 41 ProcessMemoryTotalsDumpProvider::CreateForProcess(ProcessHandle process) {
42 return Singleton< 42 return make_scoped_ptr(new ProcessMemoryTotalsDumpProvider(process));
43 ProcessMemoryTotalsDumpProvider,
44 LeakySingletonTraits<ProcessMemoryTotalsDumpProvider>>::get();
45 } 43 }
46 44
47 ProcessMemoryTotalsDumpProvider::ProcessMemoryTotalsDumpProvider() 45 ProcessMemoryTotalsDumpProvider::ProcessMemoryTotalsDumpProvider(
48 : process_metrics_(CreateProcessMetricsForCurrentProcess()) { 46 ProcessHandle process)
49 } 47 : process_(process), process_metrics_(CreateProcessMetrics(process)) {}
50 48
51 ProcessMemoryTotalsDumpProvider::~ProcessMemoryTotalsDumpProvider() { 49 ProcessMemoryTotalsDumpProvider::~ProcessMemoryTotalsDumpProvider() {
52 } 50 }
53 51
54 // Called at trace dump point time. Creates a snapshot the memory counters for 52 // Called at trace dump point time. Creates a snapshot the memory counters for
55 // the current process. 53 // the current process.
56 bool ProcessMemoryTotalsDumpProvider::OnMemoryDump(const MemoryDumpArgs& args, 54 bool ProcessMemoryTotalsDumpProvider::OnMemoryDump(const MemoryDumpArgs& args,
57 ProcessMemoryDump* pmd) { 55 ProcessMemoryDump* pmd) {
58 const uint64 rss_bytes = rss_bytes_for_testing 56 const uint64 rss_bytes = rss_bytes_for_testing
59 ? rss_bytes_for_testing 57 ? rss_bytes_for_testing
60 : process_metrics_->GetWorkingSetSize(); 58 : process_metrics_->GetWorkingSetSize();
61 59
62 uint64 peak_rss_bytes = 0; 60 uint64 peak_rss_bytes = 0;
63 61
64 #if !defined(OS_IOS) 62 #if !defined(OS_IOS)
65 peak_rss_bytes = process_metrics_->GetPeakWorkingSetSize(); 63 peak_rss_bytes = process_metrics_->GetPeakWorkingSetSize();
66 #if defined(OS_LINUX) || defined(OS_ANDROID) 64 #if defined(OS_LINUX) || defined(OS_ANDROID)
67 if (kernel_supports_rss_peak_reset) { 65 // This file cannot be wriiten from other processes. So, do not try.
68 // TODO(ssid): Fix crbug.com/461788 to write to the file from sandboxed 66 if (kernel_supports_rss_peak_reset && process_ == GetCurrentProcessHandle()) {
69 // processes.
70 int clear_refs_fd = open("/proc/self/clear_refs", O_WRONLY); 67 int clear_refs_fd = open("/proc/self/clear_refs", O_WRONLY);
71 if (clear_refs_fd > 0 && 68 if (clear_refs_fd > 0 &&
72 WriteFileDescriptor(clear_refs_fd, kClearPeakRssCommand, 69 WriteFileDescriptor(clear_refs_fd, kClearPeakRssCommand,
73 sizeof(kClearPeakRssCommand))) { 70 sizeof(kClearPeakRssCommand))) {
74 pmd->process_totals()->set_is_peak_rss_resetable(true); 71 pmd->process_totals()->set_is_peak_rss_resetable(true);
75 } else { 72 } else {
76 kernel_supports_rss_peak_reset = false; 73 kernel_supports_rss_peak_reset = false;
77 } 74 }
78 close(clear_refs_fd); 75 close(clear_refs_fd);
79 } 76 }
80 #endif // defined(OS_LINUX) || defined(OS_ANDROID) 77 #endif // defined(OS_LINUX) || defined(OS_ANDROID)
81 #endif // !defined(OS_IOS) 78 #endif // !defined(OS_IOS)
82 79
83 if (rss_bytes > 0) { 80 if (rss_bytes > 0) {
84 pmd->process_totals()->set_resident_set_bytes(rss_bytes); 81 pmd->process_totals()->set_resident_set_bytes(rss_bytes);
85 pmd->process_totals()->set_peak_resident_set_bytes(peak_rss_bytes); 82 pmd->process_totals()->set_peak_resident_set_bytes(peak_rss_bytes);
86 pmd->set_has_process_totals(); 83 pmd->set_has_process_totals();
87 return true; 84 return true;
88 } 85 }
89 86
90 return false; 87 return false;
91 } 88 }
92 89
93 } // namespace trace_event 90 } // namespace trace_event
94 } // namespace base 91 } // namespace base
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698