Where Online Learning is simpler!
The C and C++ Include Header Files
cat -n /usr/include/nodejs/src/histogram.h
1 #ifndef SRC_HISTOGRAM_H_ 2 #define SRC_HISTOGRAM_H_ 3 4 #if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS 5 6 #include <hdr/hdr_histogram.h> 7 #include "base_object.h" 8 #include "memory_tracker.h" 9 #include "node_messaging.h" 10 #include "util.h" 11 #include "uv.h" 12 #include "v8.h" 13 14 #include <functional> 15 #include <limits> 16 #include <map> 17 #include <string> 18 19 namespace node { 20 21 class ExternalReferenceRegistry; 22 23 constexpr int kDefaultHistogramFigures = 3; 24 25 class Histogram : public MemoryRetainer { 26 public: 27 struct Options { 28 int64_t lowest = 1; 29 int64_t highest = std::numeric_limits<int64_t>::max(); 30 int figures = kDefaultHistogramFigures; 31 }; 32 33 explicit Histogram(const Options& options); 34 virtual ~Histogram() = default; 35 36 inline bool Record(int64_t value); 37 inline void Reset(); 38 inline int64_t Min() const; 39 inline int64_t Max() const; 40 inline double Mean() const; 41 inline double Stddev() const; 42 inline int64_t Percentile(double percentile) const; 43 inline size_t Exceeds() const { return exceeds_; } 44 inline size_t Count() const; 45 46 inline uint64_t RecordDelta(); 47 48 inline double Add(const Histogram& other); 49 50 // Iterator is a function type that takes two doubles as argument, one for 51 // percentile and one for the value at that percentile. 52 template <typename Iterator> 53 inline void Percentiles(Iterator&& fn); 54 55 inline size_t GetMemorySize() const; 56 57 void MemoryInfo(MemoryTracker* tracker) const override; 58 SET_MEMORY_INFO_NAME(Histogram) 59 SET_SELF_SIZE(Histogram) 60 61 private: 62 using HistogramPointer = DeleteFnPtr<hdr_histogram, hdr_close>; 63 HistogramPointer histogram_; 64 uint64_t prev_ = 0; 65 size_t exceeds_ = 0; 66 size_t count_ = 0; 67 Mutex mutex_; 68 }; 69 70 class HistogramImpl { 71 public: 72 enum InternalFields { 73 kSlot = BaseObject::kSlot, 74 kImplField = BaseObject::kInternalFieldCount, 75 kInternalFieldCount 76 }; 77 78 explicit HistogramImpl( 79 const Histogram::Options& options = Histogram::Options {}); 80 explicit HistogramImpl(std::shared_ptr<Histogram> histogram); 81 82 Histogram* operator->() { return histogram_.get(); } 83 84 const std::shared_ptr<Histogram>& histogram() const { return histogram_; } 85 86 static void DoReset(const v8::FunctionCallbackInfo<v8::Value>& args); 87 static void GetCountBigInt(const v8::FunctionCallbackInfo<v8::Value>& args); 88 static void GetMinBigInt(const v8::FunctionCallbackInfo<v8::Value>& args); 89 static void GetMaxBigInt(const v8::FunctionCallbackInfo<v8::Value>& args); 90 static void GetExceedsBigInt(const v8::FunctionCallbackInfo<v8::Value>& args); 91 static void GetCount(const v8::FunctionCallbackInfo<v8::Value>& args); 92 static void GetMin(const v8::FunctionCallbackInfo<v8::Value>& args); 93 static void GetMax(const v8::FunctionCallbackInfo<v8::Value>& args); 94 static void GetMean(const v8::FunctionCallbackInfo<v8::Value>& args); 95 static void GetExceeds(const v8::FunctionCallbackInfo<v8::Value>& args); 96 static void GetStddev(const v8::FunctionCallbackInfo<v8::Value>& args); 97 static void GetPercentile(const v8::FunctionCallbackInfo<v8::Value>& args); 98 static void GetPercentileBigInt( 99 const v8::FunctionCallbackInfo<v8::Value>& args); 100 static void GetPercentiles(const v8::FunctionCallbackInfo<v8::Value>& args); 101 static void GetPercentilesBigInt( 102 const v8::FunctionCallbackInfo<v8::Value>& args); 103 104 static void FastReset(v8::Local<v8::Value> unused, 105 v8::Local<v8::Value> receiver); 106 static double FastGetCount(v8::Local<v8::Value> unused, 107 v8::Local<v8::Value> receiver); 108 static double FastGetMin(v8::Local<v8::Value> unused, 109 v8::Local<v8::Value> receiver); 110 static double FastGetMax(v8::Local<v8::Value> unused, 111 v8::Local<v8::Value> receiver); 112 static double FastGetMean(v8::Local<v8::Value> unused, 113 v8::Local<v8::Value> receiver); 114 static double FastGetExceeds(v8::Local<v8::Value> unused, 115 v8::Local<v8::Value> receiver); 116 static double FastGetStddev(v8::Local<v8::Value> unused, 117 v8::Local<v8::Value> receiver); 118 static double FastGetPercentile(v8::Local<v8::Value> unused, 119 v8::Local<v8::Value> receiver, 120 const double percentile); 121 122 static void AddMethods(v8::Isolate* isolate, 123 v8::Local<v8::FunctionTemplate> tmpl); 124 125 static void RegisterExternalReferences(ExternalReferenceRegistry* registry); 126 127 static HistogramImpl* FromJSObject(v8::Local<v8::Value> value); 128 129 private: 130 std::shared_ptr<Histogram> histogram_; 131 132 static v8::CFunction fast_reset_; 133 static v8::CFunction fast_get_count_; 134 static v8::CFunction fast_get_min_; 135 static v8::CFunction fast_get_max_; 136 static v8::CFunction fast_get_mean_; 137 static v8::CFunction fast_get_exceeds_; 138 static v8::CFunction fast_get_stddev_; 139 static v8::CFunction fast_get_percentile_; 140 }; 141 142 class HistogramBase final : public BaseObject, public HistogramImpl { 143 public: 144 static v8::Local<v8::FunctionTemplate> GetConstructorTemplate( 145 IsolateData* isolate_data); 146 static void Initialize(IsolateData* isolate_data, 147 v8::Local<v8::ObjectTemplate> target); 148 static void RegisterExternalReferences(ExternalReferenceRegistry* registry); 149 150 static BaseObjectPtr<HistogramBase> Create( 151 Environment* env, 152 const Histogram::Options& options = Histogram::Options {}); 153 154 static BaseObjectPtr<HistogramBase> Create( 155 Environment* env, 156 std::shared_ptr<Histogram> histogram); 157 158 static void New(const v8::FunctionCallbackInfo<v8::Value>& args); 159 160 void MemoryInfo(MemoryTracker* tracker) const override; 161 SET_MEMORY_INFO_NAME(HistogramBase) 162 SET_SELF_SIZE(HistogramBase) 163 164 static void Record(const v8::FunctionCallbackInfo<v8::Value>& args); 165 static void RecordDelta(const v8::FunctionCallbackInfo<v8::Value>& args); 166 static void Add(const v8::FunctionCallbackInfo<v8::Value>& args); 167 168 static void FastRecord( 169 v8::Local<v8::Value> unused, 170 v8::Local<v8::Value> receiver, 171 const int64_t value, 172 v8::FastApiCallbackOptions& options); // NOLINT(runtime/references) 173 static void FastRecordDelta(v8::Local<v8::Value> unused, 174 v8::Local<v8::Value> receiver); 175 176 HistogramBase( 177 Environment* env, 178 v8::Local<v8::Object> wrap, 179 const Histogram::Options& options = Histogram::Options {}); 180 181 HistogramBase( 182 Environment* env, 183 v8::Local<v8::Object> wrap, 184 std::shared_ptr<Histogram> histogram); 185 186 BaseObject::TransferMode GetTransferMode() const override { 187 return TransferMode::kCloneable; 188 } 189 std::unique_ptr<worker::TransferData> CloneForMessaging() const override; 190 191 class HistogramTransferData : public worker::TransferData { 192 public: 193 explicit HistogramTransferData(const HistogramBase* histogram) 194 : histogram_(histogram->histogram()) {} 195 196 explicit HistogramTransferData(std::shared_ptr<Histogram> histogram) 197 : histogram_(std::move(histogram)) {} 198 199 BaseObjectPtr<BaseObject> Deserialize( 200 Environment* env, 201 v8::Local<v8::Context> context, 202 std::unique_ptr<worker::TransferData> self) override; 203 204 void MemoryInfo(MemoryTracker* tracker) const override; 205 SET_MEMORY_INFO_NAME(HistogramTransferData) 206 SET_SELF_SIZE(HistogramTransferData) 207 208 private: 209 std::shared_ptr<Histogram> histogram_; 210 }; 211 212 private: 213 static v8::CFunction fast_record_; 214 static v8::CFunction fast_record_delta_; 215 }; 216 217 class IntervalHistogram final : public HandleWrap, public HistogramImpl { 218 public: 219 enum class StartFlags { 220 NONE, 221 RESET 222 }; 223 224 static void RegisterExternalReferences(ExternalReferenceRegistry* registry); 225 226 static v8::Local<v8::FunctionTemplate> GetConstructorTemplate( 227 Environment* env); 228 229 static BaseObjectPtr<IntervalHistogram> Create( 230 Environment* env, 231 int32_t interval, 232 std::function<void(Histogram&)> on_interval, 233 const Histogram::Options& options); 234 235 IntervalHistogram( 236 Environment* env, 237 v8::Local<v8::Object> wrap, 238 AsyncWrap::ProviderType type, 239 int32_t interval, 240 std::function<void(Histogram&)> on_interval, 241 const Histogram::Options& options = Histogram::Options {}); 242 243 static void Start(const v8::FunctionCallbackInfo<v8::Value>& args); 244 static void Stop(const v8::FunctionCallbackInfo<v8::Value>& args); 245 246 static void FastStart(v8::Local<v8::Value> unused, 247 v8::Local<v8::Value> receiver, 248 bool reset); 249 static void FastStop(v8::Local<v8::Value> unused, 250 v8::Local<v8::Value> receiver); 251 252 BaseObject::TransferMode GetTransferMode() const override { 253 return TransferMode::kCloneable; 254 } 255 std::unique_ptr<worker::TransferData> CloneForMessaging() const override; 256 257 void MemoryInfo(MemoryTracker* tracker) const override; 258 SET_MEMORY_INFO_NAME(IntervalHistogram) 259 SET_SELF_SIZE(IntervalHistogram) 260 261 private: 262 static void TimerCB(uv_timer_t* handle); 263 void OnStart(StartFlags flags = StartFlags::RESET); 264 void OnStop(); 265 266 bool enabled_ = false; 267 int32_t interval_ = 0; 268 std::function<void(Histogram&)> on_interval_; 269 uv_timer_t timer_; 270 271 static v8::CFunction fast_start_; 272 static v8::CFunction fast_stop_; 273 }; 274 275 } // namespace node 276 277 #endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS 278 279 #endif // SRC_HISTOGRAM_H_