OLD | NEW |
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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 #ifndef CHROME_BROWSER_MEMORY_DETAILS_H_ | 5 #ifndef CHROME_BROWSER_MEMORY_DETAILS_H_ |
6 #define CHROME_BROWSER_MEMORY_DETAILS_H_ | 6 #define CHROME_BROWSER_MEMORY_DETAILS_H_ |
7 | 7 |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/process_util.h" | 10 #include "base/process_util.h" |
11 #include "base/ref_counted.h" | 11 #include "base/ref_counted.h" |
12 #include "chrome/common/child_process_info.h" | 12 #include "chrome/common/child_process_info.h" |
13 | 13 |
14 class MessageLoop; | 14 class MessageLoop; |
15 | 15 |
16 // We collect data about each browser process. A browser may | 16 // We collect data about each browser process. A browser may |
17 // have multiple processes (of course!). Even IE has multiple | 17 // have multiple processes (of course!). Even IE has multiple |
18 // processes these days. | 18 // processes these days. |
19 struct ProcessMemoryInformation { | 19 struct ProcessMemoryInformation { |
20 ProcessMemoryInformation() { | 20 ProcessMemoryInformation() |
21 memset(this, 0, sizeof(ProcessMemoryInformation)); | 21 : pid(0), |
| 22 num_processes(0), |
| 23 is_diagnostics(false), |
| 24 type(ChildProcessInfo::UNKNOWN_PROCESS) { |
22 } | 25 } |
23 | 26 |
24 // The process id. | 27 // The process id. |
25 int pid; | 28 int pid; |
26 // The working set information. | 29 // The working set information. |
27 base::WorkingSetKBytes working_set; | 30 base::WorkingSetKBytes working_set; |
28 // The committed bytes. | 31 // The committed bytes. |
29 base::CommittedKBytes committed; | 32 base::CommittedKBytes committed; |
30 // The process version | 33 // The process version |
31 std::wstring version; | 34 std::wstring version; |
32 // The process product name. | 35 // The process product name. |
33 std::wstring product_name; | 36 std::wstring product_name; |
34 // The number of processes which this memory represents. | 37 // The number of processes which this memory represents. |
35 int num_processes; | 38 int num_processes; |
36 // A process is a diagnostics process if it is rendering | 39 // A process is a diagnostics process if it is rendering |
37 // about:xxx information. | 40 // about:xxx information. |
38 bool is_diagnostics; | 41 bool is_diagnostics; |
39 // If this is a child process of Chrome, what type (i.e. plugin) it is. | 42 // If this is a child process of Chrome, what type (i.e. plugin) it is. |
40 ChildProcessInfo::ProcessType type; | 43 ChildProcessInfo::ProcessType type; |
41 // A collection of titles used, i.e. for a tab it'll show all the page titles. | 44 // A collection of titles used, i.e. for a tab it'll show all the page titles. |
42 std::vector<std::wstring> titles; | 45 std::vector<std::wstring> titles; |
43 }; | 46 }; |
44 | 47 |
45 typedef std::vector<ProcessMemoryInformation> ProcessMemoryInformationList; | 48 typedef std::vector<ProcessMemoryInformation> ProcessMemoryInformationList; |
46 | 49 |
47 // Browser Process Information. | 50 // Browser Process Information. |
48 struct ProcessData { | 51 struct ProcessData { |
49 const wchar_t* name; | 52 std::wstring name; |
50 const wchar_t* process_name; | 53 std::wstring process_name; |
51 ProcessMemoryInformationList processes; | 54 ProcessMemoryInformationList processes; |
52 }; | 55 }; |
53 | 56 |
54 // MemoryDetails fetches memory details about current running browsers. | 57 // MemoryDetails fetches memory details about current running browsers. |
55 // Because this data can only be fetched asynchronously, callers use | 58 // Because this data can only be fetched asynchronously, callers use |
56 // this class via a callback. | 59 // this class via a callback. |
57 // | 60 // |
58 // Example usage: | 61 // Example usage: |
59 // | 62 // |
60 // class MyMemoryDetailConsumer : public MemoryDetails { | 63 // class MyMemoryDetailConsumer : public MemoryDetails { |
61 // | 64 // |
62 // MyMemoryDetailConsumer() : MemoryDetails(true) { | 65 // MyMemoryDetailConsumer() : MemoryDetails(true) { |
63 // StartFetch(); // Starts fetching details. | 66 // StartFetch(); // Starts fetching details. |
64 // } | 67 // } |
65 // | 68 // |
66 // // Your class stuff here | 69 // // Your class stuff here |
67 // | 70 // |
68 // virtual void OnDetailsAvailable() { | 71 // virtual void OnDetailsAvailable() { |
69 // // do work with memory info here | 72 // // do work with memory info here |
70 // } | 73 // } |
71 // } | 74 // } |
72 class MemoryDetails : public base::RefCountedThreadSafe<MemoryDetails> { | 75 class MemoryDetails : public base::RefCountedThreadSafe<MemoryDetails> { |
73 public: | 76 public: |
74 // Known browsers which we collect details for. | |
75 enum { | |
76 CHROME_BROWSER = 0, | |
77 IE_BROWSER, | |
78 FIREFOX_BROWSER, | |
79 OPERA_BROWSER, | |
80 SAFARI_BROWSER, | |
81 IE_64BIT_BROWSER, | |
82 KONQUEROR_BROWSER, | |
83 MAX_BROWSERS | |
84 } BrowserProcess; | |
85 | |
86 // Constructor. | 77 // Constructor. |
87 MemoryDetails(); | 78 MemoryDetails(); |
88 virtual ~MemoryDetails() {} | 79 virtual ~MemoryDetails() {} |
89 | 80 |
90 // Access to the process detail information. This is an array | 81 // Access to the process detail information. This data is only available |
91 // of MAX_BROWSER ProcessData structures. This data is only available | |
92 // after OnDetailsAvailable() has been called. | 82 // after OnDetailsAvailable() has been called. |
93 ProcessData* processes() { return process_data_; } | 83 const std::vector<ProcessData>& processes() { return process_data_; } |
94 | 84 |
95 // Initiate updating the current memory details. These are fetched | 85 // Initiate updating the current memory details. These are fetched |
96 // asynchronously because data must be collected from multiple threads. | 86 // asynchronously because data must be collected from multiple threads. |
97 // OnDetailsAvailable will be called when this process is complete. | 87 // OnDetailsAvailable will be called when this process is complete. |
98 void StartFetch(); | 88 void StartFetch(); |
99 | 89 |
100 virtual void OnDetailsAvailable() {} | 90 virtual void OnDetailsAvailable() {} |
101 | 91 |
102 private: | 92 private: |
103 // Collect child process information on the IO thread. This is needed because | 93 // Collect child process information on the IO thread. This is needed because |
(...skipping 12 matching lines...) Expand all Loading... |
116 void CollectProcessData(std::vector<ProcessMemoryInformation>); | 106 void CollectProcessData(std::vector<ProcessMemoryInformation>); |
117 | 107 |
118 // Collect child process information on the UI thread. Information about | 108 // Collect child process information on the UI thread. Information about |
119 // renderer processes is only available there. | 109 // renderer processes is only available there. |
120 void CollectChildInfoOnUIThread(); | 110 void CollectChildInfoOnUIThread(); |
121 | 111 |
122 // Each time we take a memory sample, we do a little work to update | 112 // Each time we take a memory sample, we do a little work to update |
123 // the global histograms for tracking memory usage. | 113 // the global histograms for tracking memory usage. |
124 void UpdateHistograms(); | 114 void UpdateHistograms(); |
125 | 115 |
126 ProcessData process_data_[MAX_BROWSERS]; | 116 // Returns a pointer to the ProcessData structure for Chrome. |
| 117 ProcessData* ChromeBrowser(); |
| 118 |
| 119 std::vector<ProcessData> process_data_; |
127 MessageLoop* ui_loop_; | 120 MessageLoop* ui_loop_; |
128 | 121 |
129 DISALLOW_EVIL_CONSTRUCTORS(MemoryDetails); | 122 DISALLOW_EVIL_CONSTRUCTORS(MemoryDetails); |
130 }; | 123 }; |
131 | 124 |
132 #endif // CHROME_BROWSER_MEMORY_DETAILS_H_ | 125 #endif // CHROME_BROWSER_MEMORY_DETAILS_H_ |
OLD | NEW |