~evarlast/ubuntu/utopic/mongodb/upstart-workaround-debian-bug-718702

« back to all changes in this revision

Viewing changes to src/third_party/v8/src/counters.h

  • Committer: Package Import Robot
  • Author(s): James Page, James Page, Robie Basak
  • Date: 2013-05-29 17:44:42 UTC
  • mfrom: (44.1.7 sid)
  • Revision ID: package-import@ubuntu.com-20130529174442-z0a4qmoww4y0t458
Tags: 1:2.4.3-1ubuntu1
[ James Page ]
* Merge from Debian unstable, remaining changes:
  - Enable SSL support:
    + d/control: Add libssl-dev to BD's.
    + d/rules: Enabled --ssl option.
    + d/mongodb.conf: Add example SSL configuration options.
  - d/mongodb-server.mongodb.upstart: Add upstart configuration.
  - d/rules: Don't strip binaries during scons build for Ubuntu.
  - d/control: Add armhf to target archs.
  - d/p/SConscript.client.patch: fixup install of client libraries.
  - d/p/0010-install-libs-to-usr-lib-not-usr-lib64-Closes-588557.patch:
    Install libraries to lib not lib64.
* Dropped changes:
  - d/p/arm-support.patch: Included in Debian.
  - d/p/double-alignment.patch: Included in Debian.
  - d/rules,control: Debian also builds with avaliable system libraries
    now.
* Fix FTBFS due to gcc and boost upgrades in saucy:
  - d/p/0008-ignore-unused-local-typedefs.patch: Add -Wno-unused-typedefs
    to unbreak building with g++-4.8.
  - d/p/0009-boost-1.53.patch: Fixup signed/unsigned casting issue.

[ Robie Basak ]
* d/p/0011-Use-a-signed-char-to-store-BSONType-enumerations.patch: Fixup
  build failure on ARM due to missing signed'ness of char cast.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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.
 
45
  void SetCounterFunction(CounterLookupCallback f) {
 
46
    lookup_function_ = f;
 
47
  }
 
48
 
 
49
  // Register an application-defined function to create
 
50
  // a histogram for passing to the AddHistogramSample function
 
51
  void SetCreateHistogramFunction(CreateHistogramCallback f) {
 
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
 
57
  void SetAddHistogramSampleFunction(AddHistogramSampleCallback f) {
 
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
 
 
105
  DISALLOW_COPY_AND_ASSIGN(StatsTable);
 
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_;
 
123
  bool lookup_done_;
 
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.
 
163
  int* GetInternalPointer() {
 
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 };
 
183
struct StatsCounterTimer {
 
184
  StatsCounter counter_;
 
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_;
 
210
  int num_buckets_;
 
211
  void* histogram_;
 
212
  bool lookup_done_;
 
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
 protected:
 
223
  // Returns the handle to the histogram.
 
224
  void* GetHistogram() {
 
225
    if (!lookup_done_) {
 
226
      lookup_done_ = true;
 
227
      histogram_ = CreateHistogram();
 
228
    }
 
229
    return histogram_;
 
230
  }
 
231
 
 
232
 private:
 
233
  void* CreateHistogram() const;
 
234
};
 
235
 
 
236
// A HistogramTimer allows distributions of results to be created
 
237
// HistogramTimer t = { {L"foo", 0, 10000, 50, NULL, false}, 0, 0 };
 
238
struct HistogramTimer {
 
239
  Histogram histogram_;
 
240
 
 
241
  int64_t start_time_;
 
242
  int64_t stop_time_;
 
243
 
 
244
  // Start the timer.
 
245
  void Start();
 
246
 
 
247
  // Stop the timer and record the results.
 
248
  void Stop();
 
249
 
 
250
  // Returns true if the timer is running.
 
251
  bool Running() {
 
252
    return histogram_.Enabled() && (start_time_ != 0) && (stop_time_ == 0);
 
253
  }
 
254
};
 
255
 
 
256
// Helper class for scoping a HistogramTimer.
 
257
class HistogramTimerScope BASE_EMBEDDED {
 
258
 public:
 
259
  explicit HistogramTimerScope(HistogramTimer* timer) :
 
260
  timer_(timer) {
 
261
    timer_->Start();
 
262
  }
 
263
  ~HistogramTimerScope() {
 
264
    timer_->Stop();
 
265
  }
 
266
 private:
 
267
  HistogramTimer* timer_;
 
268
};
 
269
 
 
270
 
 
271
} }  // namespace v8::internal
 
272
 
 
273
#endif  // V8_COUNTERS_H_