v8  3.14.5(node0.10.28)
V8 is Google's open source JavaScript engine
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
counters.h
Go to the documentation of this file.
1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are
4 // met:
5 //
6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided
11 // with the distribution.
12 // * Neither the name of Google Inc. nor the names of its
13 // contributors may be used to endorse or promote products derived
14 // from this software without specific prior written permission.
15 //
16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 
28 #ifndef V8_COUNTERS_H_
29 #define V8_COUNTERS_H_
30 
31 #include "../include/v8.h"
32 #include "allocation.h"
33 
34 namespace v8 {
35 namespace internal {
36 
37 // StatsCounters is an interface for plugging into external
38 // counters for monitoring. Counters can be looked up and
39 // manipulated by name.
40 
41 class StatsTable {
42  public:
43  // Register an application-defined function where
44  // counters can be looked up.
46  lookup_function_ = f;
47  }
48 
49  // Register an application-defined function to create
50  // a histogram for passing to the AddHistogramSample function
52  create_histogram_function_ = f;
53  }
54 
55  // Register an application-defined function to add a sample
56  // to a histogram created with CreateHistogram function
58  add_histogram_sample_function_ = f;
59  }
60 
61  bool HasCounterFunction() const {
62  return lookup_function_ != NULL;
63  }
64 
65  // Lookup the location of a counter by name. If the lookup
66  // is successful, returns a non-NULL pointer for writing the
67  // value of the counter. Each thread calling this function
68  // may receive a different location to store it's counter.
69  // The return value must not be cached and re-used across
70  // threads, although a single thread is free to cache it.
71  int* FindLocation(const char* name) {
72  if (!lookup_function_) return NULL;
73  return lookup_function_(name);
74  }
75 
76  // Create a histogram by name. If the create is successful,
77  // returns a non-NULL pointer for use with AddHistogramSample
78  // function. min and max define the expected minimum and maximum
79  // sample values. buckets is the maximum number of buckets
80  // that the samples will be grouped into.
81  void* CreateHistogram(const char* name,
82  int min,
83  int max,
84  size_t buckets) {
85  if (!create_histogram_function_) return NULL;
86  return create_histogram_function_(name, min, max, buckets);
87  }
88 
89  // Add a sample to a histogram created with the CreateHistogram
90  // function.
91  void AddHistogramSample(void* histogram, int sample) {
92  if (!add_histogram_sample_function_) return;
93  return add_histogram_sample_function_(histogram, sample);
94  }
95 
96  private:
97  StatsTable();
98 
99  CounterLookupCallback lookup_function_;
100  CreateHistogramCallback create_histogram_function_;
101  AddHistogramSampleCallback add_histogram_sample_function_;
102 
103  friend class Isolate;
104 
106 };
107 
108 // StatsCounters are dynamically created values which can be tracked in
109 // the StatsTable. They are designed to be lightweight to create and
110 // easy to use.
111 //
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
114 // a name (stored in the table metadata). Since the storage location can be
115 // thread-specific, this class cannot be shared across threads.
116 //
117 // This class is designed to be POD initialized. It will be registered with
118 // the counter system on first use. For example:
119 // StatsCounter c = { "c:myctr", NULL, false };
120 struct StatsCounter {
121  const char* name_;
122  int* ptr_;
124 
125  // Sets the counter to a specific value.
126  void Set(int value) {
127  int* loc = GetPtr();
128  if (loc) *loc = value;
129  }
130 
131  // Increments the counter.
132  void Increment() {
133  int* loc = GetPtr();
134  if (loc) (*loc)++;
135  }
136 
137  void Increment(int value) {
138  int* loc = GetPtr();
139  if (loc)
140  (*loc) += value;
141  }
142 
143  // Decrements the counter.
144  void Decrement() {
145  int* loc = GetPtr();
146  if (loc) (*loc)--;
147  }
148 
149  void Decrement(int value) {
150  int* loc = GetPtr();
151  if (loc) (*loc) -= value;
152  }
153 
154  // Is this counter enabled?
155  // Returns false if table is full.
156  bool Enabled() {
157  return GetPtr() != NULL;
158  }
159 
160  // Get the internal pointer to the counter. This is used
161  // by the code generator to emit code that manipulates a
162  // given counter without calling the runtime system.
164  int* loc = GetPtr();
165  ASSERT(loc != NULL);
166  return loc;
167  }
168 
169  protected:
170  // Returns the cached address of this counter location.
171  int* GetPtr() {
172  if (lookup_done_) return ptr_;
173  lookup_done_ = true;
174  ptr_ = FindLocationInStatsTable();
175  return ptr_;
176  }
177 
178  private:
179  int* FindLocationInStatsTable() const;
180 };
181 
182 // StatsCounterTimer t = { { L"t:foo", NULL, false }, 0, 0 };
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 };
200 
201 // A Histogram represents a dynamically created histogram in the StatsTable.
202 //
203 // This class is designed to be POD initialized. It will be registered with
204 // the histogram system on first use. For example:
205 // Histogram h = { "myhist", 0, 10000, 50, NULL, false };
206 struct Histogram {
207  const char* name_;
208  int min_;
209  int max_;
211  void* histogram_;
213 
214  // Add a single sample to this histogram.
215  void AddSample(int sample);
216 
217  // Returns true if this histogram is enabled.
218  bool Enabled() {
219  return GetHistogram() != NULL;
220  }
221 
222  // Reset the cached internal pointer.
223  void Reset() {
224  lookup_done_ = false;
225  }
226 
227  protected:
228  // Returns the handle to the histogram.
229  void* GetHistogram() {
230  if (!lookup_done_) {
231  lookup_done_ = true;
232  histogram_ = CreateHistogram();
233  }
234  return histogram_;
235  }
236 
237  private:
238  void* CreateHistogram() const;
239 };
240 
241 // A HistogramTimer allows distributions of results to be created
242 // HistogramTimer t = { {L"foo", 0, 10000, 50, NULL, false}, 0, 0 };
245 
246  int64_t start_time_;
247  int64_t stop_time_;
248 
249  // Start the timer.
250  void Start();
251 
252  // Stop the timer and record the results.
253  void Stop();
254 
255  // Returns true if the timer is running.
256  bool Running() {
257  return histogram_.Enabled() && (start_time_ != 0) && (stop_time_ == 0);
258  }
259 
260  void Reset() {
261  histogram_.Reset();
262  }
263 };
264 
265 // Helper class for scoping a HistogramTimer.
266 class HistogramTimerScope BASE_EMBEDDED {
267  public:
269  timer_(timer) {
270  timer_->Start();
271  }
273  timer_->Stop();
274  }
275  private:
276  HistogramTimer* timer_;
277 };
278 
279 
280 } } // namespace v8::internal
281 
282 #endif // V8_COUNTERS_H_
int *(* CounterLookupCallback)(const char *name)
Definition: v8.h:2690
TickSample * sample
void AddSample(int sample)
Definition: counters.cc:67
const char * name_
Definition: counters.h:207
#define ASSERT(condition)
Definition: checks.h:270
void SetCounterFunction(CounterLookupCallback f)
Definition: counters.h:45
void *(* CreateHistogramCallback)(const char *name, int min, int max, size_t buckets)
Definition: v8.h:2692
void SetAddHistogramSampleFunction(AddHistogramSampleCallback f)
Definition: counters.h:57
HistogramTimerScope(HistogramTimer *timer)
Definition: counters.h:268
#define DISALLOW_COPY_AND_ASSIGN(TypeName)
Definition: globals.h:307
void Increment(int value)
Definition: counters.h:137
void(* AddHistogramSampleCallback)(void *histogram, int sample)
Definition: v8.h:2697
#define BASE_EMBEDDED
Definition: allocation.h:68
bool HasCounterFunction() const
Definition: counters.h:61
void Decrement(int value)
Definition: counters.h:149
void SetCreateHistogramFunction(CreateHistogramCallback f)
Definition: counters.h:51
activate correct semantics for inheriting readonliness enable harmony semantics for typeof enable harmony enable harmony proxies enable all harmony harmony_scoping harmony_proxies harmony_scoping tracks arrays with only smi values automatically unbox arrays of doubles use crankshaft use hydrogen range analysis use hydrogen global value numbering use function inlining maximum number of AST nodes considered for a single inlining loop invariant code motion print statistics for hydrogen trace generated IR for specified phases trace register allocator trace range analysis trace representation types environment for every instruction put a break point before deoptimizing polymorphic inlining perform array bounds checks elimination use dead code elimination trace on stack replacement optimize closures cache optimized code for closures functions with arguments object loop weight for representation inference allow uint32 values on optimize frames if they are used only in safe operations track parallel recompilation enable all profiler experiments number of stack frames inspected by the profiler call recompile stub directly when self optimizing trigger profiler ticks based on counting instead of timing weight back edges by jump distance for interrupt triggering percentage of ICs that must have type info to allow optimization watch_ic_patching retry_self_opt interrupt_at_exit extra verbose compilation tracing generate extra emit comments in code disassembly enable use of SSE3 instructions if available enable use of CMOV instruction if available enable use of SAHF instruction if enable use of VFP3 instructions if available this implies enabling ARMv7 and VFP2 enable use of VFP2 instructions if available enable use of SDIV and UDIV instructions if enable loading bit constant by means of movw movt instruction enable unaligned accesses for enable use of MIPS FPU instructions if NULL
Definition: flags.cc:301
void * CreateHistogram(const char *name, int min, int max, size_t buckets)
Definition: counters.h:81
int * FindLocation(const char *name)
Definition: counters.h:71
void AddHistogramSample(void *histogram, int sample)
Definition: counters.h:91
void Set(int value)
Definition: counters.h:126