memory_details.h revision ddb351dbec246cf1fab5ec20d2d5520909041de1
1// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CHROME_BROWSER_MEMORY_DETAILS_H_
6#define CHROME_BROWSER_MEMORY_DETAILS_H_
7#pragma once
8
9#include <vector>
10
11#include "base/memory/ref_counted.h"
12#include "base/process_util.h"
13#include "base/string16.h"
14#include "content/common/child_process_info.h"
15
16// We collect data about each browser process.  A browser may
17// have multiple processes (of course!).  Even IE has multiple
18// processes these days.
19struct ProcessMemoryInformation {
20  ProcessMemoryInformation();
21  ~ProcessMemoryInformation();
22
23  // The process id.
24  base::ProcessId pid;
25  // The working set information.
26  base::WorkingSetKBytes working_set;
27  // The committed bytes.
28  base::CommittedKBytes committed;
29  // The process version
30  string16 version;
31  // The process product name.
32  string16 product_name;
33  // The number of processes which this memory represents.
34  int num_processes;
35  // A process is a diagnostics process if it is rendering about:memory.
36  // Mark this specially so that it can avoid counting it in its own
37  // results.
38  bool is_diagnostics;
39  // If this is a child process of Chrome, what type (i.e. plugin) it is.
40  ChildProcessInfo::ProcessType type;
41  // If this is a renderer process, what type it is.
42  ChildProcessInfo::RendererProcessType renderer_type;
43  // A collection of titles used, i.e. for a tab it'll show all the page titles.
44  std::vector<string16> titles;
45};
46
47typedef std::vector<ProcessMemoryInformation> ProcessMemoryInformationList;
48
49// Browser Process Information.
50struct ProcessData {
51  ProcessData();
52  ProcessData(const ProcessData& rhs);
53  ~ProcessData();
54  ProcessData& operator=(const ProcessData& rhs);
55
56  string16 name;
57  string16 process_name;
58  ProcessMemoryInformationList processes;
59};
60
61#if defined(OS_MACOSX)
62class ProcessInfoSnapshot;
63#endif
64
65// MemoryDetails fetches memory details about current running browsers.
66// Because this data can only be fetched asynchronously, callers use
67// this class via a callback.
68//
69// Example usage:
70//
71//    class MyMemoryDetailConsumer : public MemoryDetails {
72//
73//      MyMemoryDetailConsumer() {
74//        // Anything but |StartFetch()|.
75//      }
76//
77//      // (Or just call |StartFetch()| explicitly if there's nothing else to
78//      // do.)
79//      void StartDoingStuff() {
80//        StartFetch();  // Starts fetching details.
81//        // Etc.
82//      }
83//
84//      // Your other class stuff here
85//
86//      virtual void OnDetailsAvailable() {
87//        // do work with memory info here
88//      }
89//    }
90class MemoryDetails : public base::RefCountedThreadSafe<MemoryDetails> {
91 public:
92  // Constructor.
93  MemoryDetails();
94
95  // Access to the process detail information.  This data is only available
96  // after OnDetailsAvailable() has been called.
97  const std::vector<ProcessData>& processes() { return process_data_; }
98
99  // Initiate updating the current memory details.  These are fetched
100  // asynchronously because data must be collected from multiple threads.
101  // OnDetailsAvailable will be called when this process is complete.
102  void StartFetch();
103
104  virtual void OnDetailsAvailable() {}
105
106 protected:
107  friend class base::RefCountedThreadSafe<MemoryDetails>;
108
109  virtual ~MemoryDetails();
110
111 private:
112  // Collect child process information on the IO thread.  This is needed because
113  // information about some child process types (i.e. plugins) can only be taken
114  // on that thread.  The data will be used by about:memory.  When finished,
115  // invokes back to the file thread to run the rest of the about:memory
116  // functionality.
117  void CollectChildInfoOnIOThread();
118
119  // Collect current process information from the OS and store it
120  // for processing.  If data has already been collected, clears old
121  // data and re-collects the data.
122  // Note - this function enumerates memory details from many processes
123  // and is fairly expensive to run, hence it's run on the file thread.
124  // The parameter holds information about processes from the IO thread.
125  void CollectProcessData(const std::vector<ProcessMemoryInformation>&);
126
127#if defined(OS_MACOSX)
128  // A helper for |CollectProcessData()|, collecting data on the Chrome/Chromium
129  // process with PID |pid|. The collected data is added to the state of the
130  // object (in |process_data_|).
131  void CollectProcessDataChrome(
132      const std::vector<ProcessMemoryInformation>& child_info,
133      base::ProcessId pid,
134      const ProcessInfoSnapshot& process_info);
135#endif
136
137  // Collect child process information on the UI thread.  Information about
138  // renderer processes is only available there.
139  void CollectChildInfoOnUIThread();
140
141  // Each time we take a memory sample, we do a little work to update
142  // the global histograms for tracking memory usage.
143  void UpdateHistograms();
144
145  // Returns a pointer to the ProcessData structure for Chrome.
146  ProcessData* ChromeBrowser();
147
148  std::vector<ProcessData> process_data_;
149
150  DISALLOW_COPY_AND_ASSIGN(MemoryDetails);
151};
152
153#endif  // CHROME_BROWSER_MEMORY_DETAILS_H_
154