OLD | NEW |
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 20 matching lines...) Expand all Loading... |
31 #include "../include/v8.h" | 31 #include "../include/v8.h" |
32 #include "allocation.h" | 32 #include "allocation.h" |
33 | 33 |
34 namespace v8 { | 34 namespace v8 { |
35 namespace internal { | 35 namespace internal { |
36 | 36 |
37 // StatsCounters is an interface for plugging into external | 37 // StatsCounters is an interface for plugging into external |
38 // counters for monitoring. Counters can be looked up and | 38 // counters for monitoring. Counters can be looked up and |
39 // manipulated by name. | 39 // manipulated by name. |
40 | 40 |
41 class StatsTable : public AllStatic { | 41 class StatsTable { |
42 public: | 42 public: |
43 // Register an application-defined function where | 43 // Register an application-defined function where |
44 // counters can be looked up. | 44 // counters can be looked up. |
45 static void SetCounterFunction(CounterLookupCallback f) { | 45 void SetCounterFunction(CounterLookupCallback f) { |
46 lookup_function_ = f; | 46 lookup_function_ = f; |
47 } | 47 } |
48 | 48 |
49 // Register an application-defined function to create | 49 // Register an application-defined function to create |
50 // a histogram for passing to the AddHistogramSample function | 50 // a histogram for passing to the AddHistogramSample function |
51 static void SetCreateHistogramFunction(CreateHistogramCallback f) { | 51 void SetCreateHistogramFunction(CreateHistogramCallback f) { |
52 create_histogram_function_ = f; | 52 create_histogram_function_ = f; |
53 } | 53 } |
54 | 54 |
55 // Register an application-defined function to add a sample | 55 // Register an application-defined function to add a sample |
56 // to a histogram created with CreateHistogram function | 56 // to a histogram created with CreateHistogram function |
57 static void SetAddHistogramSampleFunction(AddHistogramSampleCallback f) { | 57 void SetAddHistogramSampleFunction(AddHistogramSampleCallback f) { |
58 add_histogram_sample_function_ = f; | 58 add_histogram_sample_function_ = f; |
59 } | 59 } |
60 | 60 |
61 static bool HasCounterFunction() { | 61 bool HasCounterFunction() const { |
62 return lookup_function_ != NULL; | 62 return lookup_function_ != NULL; |
63 } | 63 } |
64 | 64 |
65 // Lookup the location of a counter by name. If the lookup | 65 // Lookup the location of a counter by name. If the lookup |
66 // is successful, returns a non-NULL pointer for writing the | 66 // is successful, returns a non-NULL pointer for writing the |
67 // value of the counter. Each thread calling this function | 67 // value of the counter. Each thread calling this function |
68 // may receive a different location to store it's counter. | 68 // may receive a different location to store it's counter. |
69 // The return value must not be cached and re-used across | 69 // The return value must not be cached and re-used across |
70 // threads, although a single thread is free to cache it. | 70 // threads, although a single thread is free to cache it. |
71 static int* FindLocation(const char* name) { | 71 int* FindLocation(const char* name) { |
72 if (!lookup_function_) return NULL; | 72 if (!lookup_function_) return NULL; |
73 return lookup_function_(name); | 73 return lookup_function_(name); |
74 } | 74 } |
75 | 75 |
76 // Create a histogram by name. If the create is successful, | 76 // Create a histogram by name. If the create is successful, |
77 // returns a non-NULL pointer for use with AddHistogramSample | 77 // returns a non-NULL pointer for use with AddHistogramSample |
78 // function. min and max define the expected minimum and maximum | 78 // function. min and max define the expected minimum and maximum |
79 // sample values. buckets is the maximum number of buckets | 79 // sample values. buckets is the maximum number of buckets |
80 // that the samples will be grouped into. | 80 // that the samples will be grouped into. |
81 static void* CreateHistogram(const char* name, | 81 void* CreateHistogram(const char* name, |
82 int min, | 82 int min, |
83 int max, | 83 int max, |
84 size_t buckets) { | 84 size_t buckets) { |
85 if (!create_histogram_function_) return NULL; | 85 if (!create_histogram_function_) return NULL; |
86 return create_histogram_function_(name, min, max, buckets); | 86 return create_histogram_function_(name, min, max, buckets); |
87 } | 87 } |
88 | 88 |
89 // Add a sample to a histogram created with the CreateHistogram | 89 // Add a sample to a histogram created with the CreateHistogram |
90 // function. | 90 // function. |
91 static void AddHistogramSample(void* histogram, int sample) { | 91 void AddHistogramSample(void* histogram, int sample) { |
92 if (!add_histogram_sample_function_) return; | 92 if (!add_histogram_sample_function_) return; |
93 return add_histogram_sample_function_(histogram, sample); | 93 return add_histogram_sample_function_(histogram, sample); |
94 } | 94 } |
95 | 95 |
96 private: | 96 private: |
97 static CounterLookupCallback lookup_function_; | 97 StatsTable(); |
98 static CreateHistogramCallback create_histogram_function_; | 98 |
99 static AddHistogramSampleCallback add_histogram_sample_function_; | 99 CounterLookupCallback lookup_function_; |
| 100 CreateHistogramCallback create_histogram_function_; |
| 101 AddHistogramSampleCallback add_histogram_sample_function_; |
| 102 |
| 103 friend class Isolate; |
| 104 |
| 105 DISALLOW_COPY_AND_ASSIGN(StatsTable); |
100 }; | 106 }; |
101 | 107 |
102 // StatsCounters are dynamically created values which can be tracked in | 108 // StatsCounters are dynamically created values which can be tracked in |
103 // the StatsTable. They are designed to be lightweight to create and | 109 // the StatsTable. They are designed to be lightweight to create and |
104 // easy to use. | 110 // easy to use. |
105 // | 111 // |
106 // 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. |
107 // 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 |
108 // 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 |
109 // thread-specific, this class cannot be shared across threads. | 115 // thread-specific, this class cannot be shared across threads. |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
159 ASSERT(loc != NULL); | 165 ASSERT(loc != NULL); |
160 return loc; | 166 return loc; |
161 } | 167 } |
162 | 168 |
163 protected: | 169 protected: |
164 // Returns the cached address of this counter location. | 170 // Returns the cached address of this counter location. |
165 int* GetPtr() { | 171 int* GetPtr() { |
166 if (lookup_done_) | 172 if (lookup_done_) |
167 return ptr_; | 173 return ptr_; |
168 lookup_done_ = true; | 174 lookup_done_ = true; |
169 ptr_ = StatsTable::FindLocation(name_); | 175 ptr_ = FindLocationInStatsTable(); |
170 return ptr_; | 176 return ptr_; |
171 } | 177 } |
| 178 |
| 179 private: |
| 180 int* FindLocationInStatsTable() const; |
172 }; | 181 }; |
173 | 182 |
174 // StatsCounterTimer t = { { L"t:foo", NULL, false }, 0, 0 }; | 183 // StatsCounterTimer t = { { L"t:foo", NULL, false }, 0, 0 }; |
175 struct StatsCounterTimer { | 184 struct StatsCounterTimer { |
176 StatsCounter counter_; | 185 StatsCounter counter_; |
177 | 186 |
178 int64_t start_time_; | 187 int64_t start_time_; |
179 int64_t stop_time_; | 188 int64_t stop_time_; |
180 | 189 |
181 // Start the timer. | 190 // Start the timer. |
(...skipping 27 matching lines...) Expand all Loading... |
209 // Returns true if the timer is running. | 218 // Returns true if the timer is running. |
210 bool Running() { | 219 bool Running() { |
211 return (histogram_ != NULL) && (start_time_ != 0) && (stop_time_ == 0); | 220 return (histogram_ != NULL) && (start_time_ != 0) && (stop_time_ == 0); |
212 } | 221 } |
213 | 222 |
214 protected: | 223 protected: |
215 // Returns the handle to the histogram. | 224 // Returns the handle to the histogram. |
216 void* GetHistogram() { | 225 void* GetHistogram() { |
217 if (!lookup_done_) { | 226 if (!lookup_done_) { |
218 lookup_done_ = true; | 227 lookup_done_ = true; |
219 histogram_ = StatsTable::CreateHistogram(name_, 0, 10000, 50); | 228 histogram_ = CreateHistogram(); |
220 } | 229 } |
221 return histogram_; | 230 return histogram_; |
222 } | 231 } |
| 232 |
| 233 private: |
| 234 void* CreateHistogram() const; |
223 }; | 235 }; |
224 | 236 |
225 // Helper class for scoping a HistogramTimer. | 237 // Helper class for scoping a HistogramTimer. |
226 class HistogramTimerScope BASE_EMBEDDED { | 238 class HistogramTimerScope BASE_EMBEDDED { |
227 public: | 239 public: |
228 explicit HistogramTimerScope(HistogramTimer* timer) : | 240 explicit HistogramTimerScope(HistogramTimer* timer) : |
229 timer_(timer) { | 241 timer_(timer) { |
230 timer_->Start(); | 242 timer_->Start(); |
231 } | 243 } |
232 ~HistogramTimerScope() { | 244 ~HistogramTimerScope() { |
233 timer_->Stop(); | 245 timer_->Stop(); |
234 } | 246 } |
235 private: | 247 private: |
236 HistogramTimer* timer_; | 248 HistogramTimer* timer_; |
237 }; | 249 }; |
238 | 250 |
239 | 251 |
240 } } // namespace v8::internal | 252 } } // namespace v8::internal |
241 | 253 |
242 #endif // V8_COUNTERS_H_ | 254 #endif // V8_COUNTERS_H_ |
OLD | NEW |