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

Side by Side Diff: src/counters.h

Issue 42020: - Added ability to call histograms from within v8... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 11 years, 9 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 | « src/compiler.cc ('k') | 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 2007-2008 the V8 project authors. All rights reserved. 1 // Copyright 2007-2008 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 24 matching lines...) Expand all
35 // manipulated by name. 35 // manipulated by name.
36 36
37 class StatsTable : public AllStatic { 37 class StatsTable : public AllStatic {
38 public: 38 public:
39 // Register an application-defined function where 39 // Register an application-defined function where
40 // counters can be looked up. 40 // counters can be looked up.
41 static void SetCounterFunction(CounterLookupCallback f) { 41 static void SetCounterFunction(CounterLookupCallback f) {
42 lookup_function_ = f; 42 lookup_function_ = f;
43 } 43 }
44 44
45 // Register an application-defined function to create
46 // a histogram for passing to the AddHistogramSample function
47 static void SetCreateHistogramFunction(CreateHistogramCallback f) {
48 create_histogram_function_ = f;
49 }
50
51 // Register an application-defined function to add a sample
52 // to a histogram created with CreateHistogram function
53 static void SetAddHistogramSampleFunction(AddHistogramSampleCallback f) {
54 add_histogram_sample_function_ = f;
55 }
56
45 static bool HasCounterFunction() { 57 static bool HasCounterFunction() {
46 return lookup_function_ != NULL; 58 return lookup_function_ != NULL;
47 } 59 }
48 60
49 // Lookup the location of a counter by name. If the lookup 61 // Lookup the location of a counter by name. If the lookup
50 // is successful, returns a non-NULL pointer for writing the 62 // is successful, returns a non-NULL pointer for writing the
51 // value of the counter. Each thread calling this function 63 // value of the counter. Each thread calling this function
52 // may receive a different location to store it's counter. 64 // may receive a different location to store it's counter.
53 // The return value must not be cached and re-used across 65 // The return value must not be cached and re-used across
54 // threads, although a single thread is free to cache it. 66 // threads, although a single thread is free to cache it.
55 static int *FindLocation(const char* name) { 67 static int *FindLocation(const char* name) {
56 if (!lookup_function_) return NULL; 68 if (!lookup_function_) return NULL;
57 return lookup_function_(name); 69 return lookup_function_(name);
58 } 70 }
59 71
72 // Create a histogram by name. If the create is successful,
73 // returns a non-NULL pointer for use with AddHistogramSample
74 // function. min and max define the expected minimum and maximum
75 // sample values. buckets is the maximum number of buckets
76 // that the samples will be grouped into.
77 static void *CreateHistogram(const char* name,
78 int min,
79 int max,
80 size_t buckets) {
81 if (!create_histogram_function_) return NULL;
82 return create_histogram_function_(name, min, max, buckets);
83 }
84
85 // Add a sample to a histogram created with the CreateHistogram
86 // function.
87 static void AddHistogramSample(void* histogram, int sample) {
88 if (!add_histogram_sample_function_) return;
89 return add_histogram_sample_function_(histogram, sample);
90 }
91
60 private: 92 private:
61 static CounterLookupCallback lookup_function_; 93 static CounterLookupCallback lookup_function_;
94 static CreateHistogramCallback create_histogram_function_;
95 static AddHistogramSampleCallback add_histogram_sample_function_;
62 }; 96 };
63 97
64 // StatsCounters are dynamically created values which can be tracked in 98 // StatsCounters are dynamically created values which can be tracked in
65 // the StatsTable. They are designed to be lightweight to create and 99 // the StatsTable. They are designed to be lightweight to create and
66 // easy to use. 100 // easy to use.
67 // 101 //
68 // Internally, a counter represents a value in a row of a StatsTable. 102 // Internally, a counter represents a value in a row of a StatsTable.
69 // The row has a 32bit value for each process/thread in the table and also 103 // The row has a 32bit value for each process/thread in the table and also
70 // a name (stored in the table metadata). Since the storage location can be 104 // a name (stored in the table metadata). Since the storage location can be
71 // thread-specific, this class cannot be shared across threads. 105 // thread-specific, this class cannot be shared across threads.
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
145 179
146 // Stop the timer and record the results. 180 // Stop the timer and record the results.
147 void Stop(); 181 void Stop();
148 182
149 // Returns true if the timer is running. 183 // Returns true if the timer is running.
150 bool Running() { 184 bool Running() {
151 return counter_.Enabled() && start_time_ != 0 && stop_time_ == 0; 185 return counter_.Enabled() && start_time_ != 0 && stop_time_ == 0;
152 } 186 }
153 }; 187 };
154 188
155 // A StatsRate is a combination of both a timer and a counter so that 189 // A HistogramTimer allows distributions of results to be created
156 // several statistics can be produced: 190 // HistogramTimer t = { L"foo", NULL, false, 0, 0 };
157 // min, max, avg, count, total 191 struct HistogramTimer {
158 // 192 const char* name_;
159 // For example: 193 void* histogram_;
160 // StatsCounter c = { { { L"t:myrate", NULL, false }, 0, 0 }, 194 bool lookup_done_;
161 // { L"c:myrate", NULL, false } };
162 struct StatsRate {
163 StatsCounterTimer timer_;
164 StatsCounter counter_;
165 195
166 // Starts the rate timer. 196 int64_t start_time_;
167 void Start() { 197 int64_t stop_time_;
168 timer_.Start(); 198
199 // Start the timer.
200 void Start();
201
202 // Stop the timer and record the results.
203 void Stop();
204
205 // Returns true if the timer is running.
206 bool Running() {
207 return (histogram_ != NULL) && (start_time_ != 0) && (stop_time_ == 0);
169 } 208 }
170 209
171 // Stops the rate and records the time. 210 protected:
172 void Stop() { 211 // Returns the handle to the histogram.
173 if (timer_.Running()) { 212 void* GetHistogram() {
174 timer_.Stop(); 213 if (!lookup_done_) {
175 counter_.Increment(); 214 lookup_done_ = true;
215 histogram_ = StatsTable::CreateHistogram(name_, 0, 10000, 50);
176 } 216 }
217 return histogram_;
177 } 218 }
178 }; 219 };
179 220
180 221 // Helper class for scoping a HistogramTimer.
181 // Helper class for scoping a rate. 222 class HistogramTimerScope BASE_EMBEDDED {
182 class StatsRateScope BASE_EMBEDDED {
183 public: 223 public:
184 explicit StatsRateScope(StatsRate* rate) : 224 explicit HistogramTimerScope(HistogramTimer* timer) :
185 rate_(rate) { 225 timer_(timer) {
186 rate_->Start(); 226 timer_->Start();
187 } 227 }
188 ~StatsRateScope() { 228 ~HistogramTimerScope() {
189 rate_->Stop(); 229 timer_->Stop();
190 } 230 }
191 private: 231 private:
192 StatsRate* rate_; 232 HistogramTimer* timer_;
193 }; 233 };
194 234
195 235
196 } } // namespace v8::internal 236 } } // namespace v8::internal
197 237
198 #endif // V8_COUNTERS_H_ 238 #endif // V8_COUNTERS_H_
OLDNEW
« no previous file with comments | « src/compiler.cc ('k') | src/counters.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698