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

Side by Side Diff: src/counters.h

Issue 14471007: Remove Isolate::Current() from histograms. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 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 | « no previous file | src/counters.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 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
106 }; 106 };
107 107
108 // StatsCounters are dynamically created values which can be tracked in 108 // StatsCounters are dynamically created values which can be tracked in
109 // the StatsTable. They are designed to be lightweight to create and 109 // the StatsTable. They are designed to be lightweight to create and
110 // easy to use. 110 // easy to use.
111 // 111 //
112 // Internally, a counter represents a value in a row of a StatsTable. 112 // Internally, a counter represents a value in a row of a StatsTable.
113 // The row has a 32bit value for each process/thread in the table and also 113 // The row has a 32bit value for each process/thread in the table and also
114 // a name (stored in the table metadata). Since the storage location can be 114 // a name (stored in the table metadata). Since the storage location can be
115 // thread-specific, this class cannot be shared across threads. 115 // thread-specific, this class cannot be shared across threads.
116 // 116 class StatsCounter {
117 // This class is designed to be POD initialized. It will be registered with 117 public:
118 // the counter system on first use. For example: 118 StatsCounter() { }
119 // StatsCounter c = { "c:myctr", NULL, false }; 119 explicit StatsCounter(const char* name)
120 struct StatsCounter { 120 : name_(name), ptr_(NULL), lookup_done_(false) { }
121 const char* name_;
122 int* ptr_;
123 bool lookup_done_;
124 121
125 // Sets the counter to a specific value. 122 // Sets the counter to a specific value.
126 void Set(int value) { 123 void Set(int value) {
127 int* loc = GetPtr(); 124 int* loc = GetPtr();
128 if (loc) *loc = value; 125 if (loc) *loc = value;
129 } 126 }
130 127
131 // Increments the counter. 128 // Increments the counter.
132 void Increment() { 129 void Increment() {
133 int* loc = GetPtr(); 130 int* loc = GetPtr();
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
170 // Returns the cached address of this counter location. 167 // Returns the cached address of this counter location.
171 int* GetPtr() { 168 int* GetPtr() {
172 if (lookup_done_) return ptr_; 169 if (lookup_done_) return ptr_;
173 lookup_done_ = true; 170 lookup_done_ = true;
174 ptr_ = FindLocationInStatsTable(); 171 ptr_ = FindLocationInStatsTable();
175 return ptr_; 172 return ptr_;
176 } 173 }
177 174
178 private: 175 private:
179 int* FindLocationInStatsTable() const; 176 int* FindLocationInStatsTable() const;
180 };
181 177
182 // StatsCounterTimer t = { { L"t:foo", NULL, false }, 0, 0 }; 178 const char* name_;
183 struct StatsCounterTimer { 179 int* ptr_;
184 StatsCounter counter_; 180 bool lookup_done_;
185
186 int64_t start_time_;
187 int64_t stop_time_;
188
189 // Start the timer.
190 void Start();
191
192 // Stop the timer and record the results.
193 void Stop();
194
195 // Returns true if the timer is running.
196 bool Running() {
197 return counter_.Enabled() && start_time_ != 0 && stop_time_ == 0;
198 }
199 }; 181 };
200 182
201 // A Histogram represents a dynamically created histogram in the StatsTable. 183 // A Histogram represents a dynamically created histogram in the StatsTable.
202 // 184 // It will be registered with the histogram system on first use.
203 // This class is designed to be POD initialized. It will be registered with 185 class Histogram {
204 // the histogram system on first use. For example: 186 public:
205 // Histogram h = { "myhist", 0, 10000, 50, NULL, false }; 187 Histogram() { }
206 struct Histogram { 188 Histogram(const char* name,
207 const char* name_; 189 int min,
208 int min_; 190 int max,
209 int max_; 191 int num_buckets,
210 int num_buckets_; 192 Isolate* isolate)
211 void* histogram_; 193 : name_(name),
212 bool lookup_done_; 194 min_(min),
195 max_(max),
196 num_buckets_(num_buckets),
197 histogram_(NULL),
198 lookup_done_(false),
199 isolate_(isolate) { }
213 200
214 // Add a single sample to this histogram. 201 // Add a single sample to this histogram.
215 void AddSample(int sample); 202 void AddSample(int sample);
216 203
217 // Returns true if this histogram is enabled. 204 // Returns true if this histogram is enabled.
218 bool Enabled() { 205 bool Enabled() {
219 return GetHistogram() != NULL; 206 return GetHistogram() != NULL;
220 } 207 }
221 208
222 // Reset the cached internal pointer. 209 // Reset the cached internal pointer.
223 void Reset() { 210 void Reset() {
224 lookup_done_ = false; 211 lookup_done_ = false;
225 } 212 }
226 213
227 protected: 214 protected:
228 // Returns the handle to the histogram. 215 // Returns the handle to the histogram.
229 void* GetHistogram() { 216 void* GetHistogram() {
230 if (!lookup_done_) { 217 if (!lookup_done_) {
231 lookup_done_ = true; 218 lookup_done_ = true;
232 histogram_ = CreateHistogram(); 219 histogram_ = CreateHistogram();
233 } 220 }
234 return histogram_; 221 return histogram_;
235 } 222 }
236 223
224 const char* name() { return name_; }
225 Isolate* isolate() const { return isolate_; }
226
237 private: 227 private:
238 void* CreateHistogram() const; 228 void* CreateHistogram() const;
229
230 const char* name_;
231 int min_;
232 int max_;
233 int num_buckets_;
234 void* histogram_;
235 bool lookup_done_;
236 Isolate* isolate_;
239 }; 237 };
240 238
241 // A HistogramTimer allows distributions of results to be created 239 // A HistogramTimer allows distributions of results to be created.
242 // HistogramTimer t = { {L"foo", 0, 10000, 50, NULL, false}, 0, 0 }; 240 class HistogramTimer : public Histogram {
243 struct HistogramTimer { 241 public:
244 Histogram histogram_; 242 HistogramTimer() { }
245 243 HistogramTimer(const char* name,
246 int64_t start_time_; 244 int min,
247 int64_t stop_time_; 245 int max,
246 int num_buckets,
247 Isolate* isolate)
248 : Histogram(name, min, max, num_buckets, isolate),
249 start_time_(0),
250 stop_time_(0) { }
248 251
249 // Start the timer. 252 // Start the timer.
250 void Start(); 253 void Start();
251 254
252 // Stop the timer and record the results. 255 // Stop the timer and record the results.
253 void Stop(); 256 void Stop();
254 257
255 // Returns true if the timer is running. 258 // Returns true if the timer is running.
256 bool Running() { 259 bool Running() {
257 return histogram_.Enabled() && (start_time_ != 0) && (stop_time_ == 0); 260 return Enabled() && (start_time_ != 0) && (stop_time_ == 0);
258 } 261 }
259 262
260 void Reset() { 263 private:
261 histogram_.Reset(); 264 int64_t start_time_;
262 } 265 int64_t stop_time_;
263 }; 266 };
264 267
265 // Helper class for scoping a HistogramTimer. 268 // Helper class for scoping a HistogramTimer.
266 class HistogramTimerScope BASE_EMBEDDED { 269 class HistogramTimerScope BASE_EMBEDDED {
267 public: 270 public:
268 explicit HistogramTimerScope(HistogramTimer* timer) : 271 explicit HistogramTimerScope(HistogramTimer* timer) :
269 timer_(timer) { 272 timer_(timer) {
270 timer_->Start(); 273 timer_->Start();
271 } 274 }
272 ~HistogramTimerScope() { 275 ~HistogramTimerScope() {
273 timer_->Stop(); 276 timer_->Stop();
274 } 277 }
275 private: 278 private:
276 HistogramTimer* timer_; 279 HistogramTimer* timer_;
277 }; 280 };
278 281
279 282
280 } } // namespace v8::internal 283 } } // namespace v8::internal
281 284
282 #endif // V8_COUNTERS_H_ 285 #endif // V8_COUNTERS_H_
OLDNEW
« no previous file with comments | « no previous file | src/counters.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698