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

Side by Side Diff: chrome/browser/metrics/tracking_synchronizer.h

Issue 10077001: [UMA] Use proper C++ objects to serialize tracked_objects across process boundaries. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix yet another IWYU in the chromeos/ code... Created 8 years, 8 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 | Annotate | Revision Log
« no previous file with comments | « base/tracked_objects_unittest.cc ('k') | chrome/browser/metrics/tracking_synchronizer.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 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 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_METRICS_TRACKING_SYNCHRONIZER_H_ 5 #ifndef CHROME_BROWSER_METRICS_TRACKING_SYNCHRONIZER_H_
6 #define CHROME_BROWSER_METRICS_TRACKING_SYNCHRONIZER_H_ 6 #define CHROME_BROWSER_METRICS_TRACKING_SYNCHRONIZER_H_
7 #pragma once 7 #pragma once
8 8
9 #include <map> 9 #include <map>
10 #include <string> 10 #include <string>
11 #include <vector> 11 #include <vector>
12 12
13 #include "base/basictypes.h" 13 #include "base/basictypes.h"
14 #include "base/lazy_instance.h" 14 #include "base/lazy_instance.h"
15 #include "base/memory/ref_counted.h" 15 #include "base/memory/ref_counted.h"
16 #include "base/memory/weak_ptr.h" 16 #include "base/memory/weak_ptr.h"
17 #include "base/values.h"
18 #include "chrome/browser/ui/webui/profiler_ui.h"
19 #include "content/public/browser/profiler_subscriber.h" 17 #include "content/public/browser/profiler_subscriber.h"
20 18
21 // This class maintains state that is used to upload profiler data from the 19 // This class maintains state that is used to upload profiler data from the
22 // various processes, into the browser process. Such transactions are usually 20 // various processes, into the browser process. Such transactions are usually
23 // instigated by the browser. In general, a process will respond by gathering 21 // instigated by the browser. In general, a process will respond by gathering
24 // profiler data, and transmitting the pickled profiler data. We collect the 22 // profiler data, and transmitting the pickled profiler data. We collect the
25 // data in asynchronous mode that doesn't block the UI thread. 23 // data in asynchronous mode that doesn't block the UI thread.
26 // 24 //
27 // To assure that all the processes have responded, a counter is maintained 25 // To assure that all the processes have responded, a counter is maintained
28 // to indicate the number of pending (not yet responsive) processes. We tag 26 // to indicate the number of pending (not yet responsive) processes. We tag
29 // each group of requests with a sequence number. For each group of requests, we 27 // each group of requests with a sequence number. For each group of requests, we
30 // create RequestContext object which stores the sequence number, pending 28 // create RequestContext object which stores the sequence number, pending
31 // processes and the callback_object that needs to be notified when we receive 29 // processes and the callback_object that needs to be notified when we receive
32 // an update from processes. When an update arrives we find the RequestContext 30 // an update from processes. When an update arrives we find the RequestContext
33 // associated with sequence number and send the unpickled profiler data to the 31 // associated with sequence number and send the unpickled profiler data to the
34 // |callback_object_|. 32 // |callback_object_|.
35 33
36 namespace chrome_browser_metrics { 34 namespace chrome_browser_metrics {
37 35
38 class RequestContext; 36 class TrackingSynchronizerObserver;
39 37
40 class TrackingSynchronizer 38 class TrackingSynchronizer
41 : public content::ProfilerSubscriber, 39 : public content::ProfilerSubscriber,
42 public base::RefCountedThreadSafe<TrackingSynchronizer> { 40 public base::RefCountedThreadSafe<TrackingSynchronizer> {
43 public: 41 public:
44 // Construction also sets up the global singleton instance. This instance is 42 // Construction also sets up the global singleton instance. This instance is
45 // used to communicate between the IO and UI thread, and is destroyed only as 43 // used to communicate between the IO and UI thread, and is destroyed only as
46 // the main thread (browser_main) terminates, which means the IO thread has 44 // the main thread (browser_main) terminates, which means the IO thread has
47 // already completed, and will not need this instance any further. 45 // already completed, and will not need this instance any further.
48 TrackingSynchronizer(); 46 TrackingSynchronizer();
49 47
50 // Contact all processes, and get them to upload to the browser any/all 48 // Contact all processes, and get them to upload to the browser any/all
51 // changes to profiler data. It calls |callback_object|'s SetData method with 49 // changes to profiler data. It calls |callback_object|'s SetData method with
52 // the data received from each sub-process. 50 // the data received from each sub-process.
53 // This method is accessible on UI thread. 51 // This method is accessible on UI thread.
54 static void FetchProfilerDataAsynchronously( 52 static void FetchProfilerDataAsynchronously(
55 const base::WeakPtr<ProfilerUI>& callback_object); 53 const base::WeakPtr<TrackingSynchronizerObserver>& callback_object);
56 54
57 // ------------------------------------------------------ 55 // ------------------------------------------------------
58 // ProfilerSubscriber methods for browser child processes 56 // ProfilerSubscriber methods for browser child processes
59 // ------------------------------------------------------ 57 // ------------------------------------------------------
60 58
61 // Update the number of pending processes for the given |sequence_number|. 59 // Update the number of pending processes for the given |sequence_number|.
62 // This is called on UI thread. 60 // This is called on UI thread.
63 virtual void OnPendingProcesses(int sequence_number, 61 virtual void OnPendingProcesses(int sequence_number,
64 int pending_processes, 62 int pending_processes,
65 bool end) OVERRIDE; 63 bool end) OVERRIDE;
66 64
65 private:
66 friend class base::RefCountedThreadSafe<TrackingSynchronizer>;
67
68 class RequestContext;
69
70 virtual ~TrackingSynchronizer();
71
67 // Send profiler_data back to callback_object_ by calling 72 // Send profiler_data back to callback_object_ by calling
68 // DecrementPendingProcessesAndSendData which records that we are waiting 73 // DecrementPendingProcessesAndSendData which records that we are waiting
69 // for one less profiler data from renderer or browser child process for the 74 // for one less profiler data from renderer or browser child process for the
70 // given sequence number. This method is accessible on UI thread. 75 // given sequence number. This method is accessible on UI thread.
71 virtual void OnProfilerDataCollected( 76 virtual void OnProfilerDataCollected(
72 int sequence_number, 77 int sequence_number,
73 base::DictionaryValue* profiler_data) OVERRIDE; 78 const tracked_objects::ProcessDataSnapshot& profiler_data,
74 79 content::ProcessType process_type) OVERRIDE;
75 private:
76 friend class base::RefCountedThreadSafe<TrackingSynchronizer>;
77 friend class RequestContext;
78
79 virtual ~TrackingSynchronizer();
80
81 // Send profiler_data back to callback_object_. It records that we are waiting
82 // for one less profiler data from renderer or browser child process for the
83 // given sequence number. This method is accessible on UI thread.
84 void OnProfilerDataCollectedOnUI(int sequence_number,
85 base::DictionaryValue* profiler_data);
86 80
87 // Establish a new sequence_number_, and use it to notify all the processes of 81 // Establish a new sequence_number_, and use it to notify all the processes of
88 // the need to supply, to the browser, their tracking data. It also registers 82 // the need to supply, to the browser, their tracking data. It also registers
89 // |callback_object| in |outstanding_requests_| map. Return the 83 // |callback_object| in |outstanding_requests_| map. Return the
90 // sequence_number_ that was used. This method is accessible on UI thread. 84 // sequence_number_ that was used. This method is accessible on UI thread.
91 int RegisterAndNotifyAllProcesses( 85 int RegisterAndNotifyAllProcesses(
92 const base::WeakPtr<ProfilerUI>& callback_object); 86 const base::WeakPtr<TrackingSynchronizerObserver>& callback_object);
93 87
94 // It finds the RequestContext for the given |sequence_number| and notifies 88 // It finds the RequestContext for the given |sequence_number| and notifies
95 // the RequestContext's |callback_object_| about the |value|. This is called 89 // the RequestContext's |callback_object_| about the |value|. This is called
96 // whenever we receive profiler data from processes. It also records that we 90 // whenever we receive profiler data from processes. It also records that we
97 // are waiting for one less profiler data from a process for the given 91 // are waiting for one less profiler data from a process for the given
98 // sequence number. If we have received a response from all renderers and 92 // sequence number. If we have received a response from all renderers and
99 // browser processes, then it calls RequestContext's DeleteIfAllDone to delete 93 // browser processes, then it calls RequestContext's DeleteIfAllDone to delete
100 // the entry for sequence_number. This method is accessible on UI thread. 94 // the entry for sequence_number. This method is accessible on UI thread.
101 void DecrementPendingProcessesAndSendData(int sequence_number, 95 void DecrementPendingProcessesAndSendData(
102 base::DictionaryValue* value); 96 int sequence_number,
97 const tracked_objects::ProcessDataSnapshot& profiler_data,
98 content::ProcessType process_type);
103 99
104 // Get a new sequence number to be sent to processes from browser process. 100 // Get a new sequence number to be sent to processes from browser process.
105 // This method is accessible on UI thread. 101 // This method is accessible on UI thread.
106 int GetNextAvailableSequenceNumber(); 102 int GetNextAvailableSequenceNumber();
107 103
108 // Return pointer to the singleton instance, which is allocated and
109 // deallocated on the main UI thread (during system startup and teardown).
110 // This method is accessible on UI thread.
111 static TrackingSynchronizer* CurrentSynchronizer();
112
113 // We don't track the actual processes that are contacted for an update, only 104 // We don't track the actual processes that are contacted for an update, only
114 // the count of the number of processes, and we can sometimes time-out and 105 // the count of the number of processes, and we can sometimes time-out and
115 // give up on a "slow to respond" process. We use a sequence_number to be 106 // give up on a "slow to respond" process. We use a sequence_number to be
116 // sure a response from a process is associated with the current round of 107 // sure a response from a process is associated with the current round of
117 // requests. All sequence numbers used are non-negative. 108 // requests. All sequence numbers used are non-negative.
118 // last_used_sequence_number_ is the most recently used number (used to avoid 109 // last_used_sequence_number_ is the most recently used number (used to avoid
119 // reuse for a long time). 110 // reuse for a long time).
120 int last_used_sequence_number_; 111 int last_used_sequence_number_;
121 112
122 // This singleton instance should be started during the single threaded
123 // portion of main(). It initializes globals to provide support for all future
124 // calls. This object is created on the UI thread, and it is destroyed after
125 // all the other threads have gone away. As a result, it is ok to call it
126 // from the UI thread, or for about:profiler.
127 static TrackingSynchronizer* tracking_synchronizer_;
128
129 DISALLOW_COPY_AND_ASSIGN(TrackingSynchronizer); 113 DISALLOW_COPY_AND_ASSIGN(TrackingSynchronizer);
130 }; 114 };
131 115
132 } // namespace chrome_browser_metrics 116 } // namespace chrome_browser_metrics
133 117
134 #endif // CHROME_BROWSER_METRICS_TRACKING_SYNCHRONIZER_H_ 118 #endif // CHROME_BROWSER_METRICS_TRACKING_SYNCHRONIZER_H_
OLDNEW
« no previous file with comments | « base/tracked_objects_unittest.cc ('k') | chrome/browser/metrics/tracking_synchronizer.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698