| File: | out/../src/histogram.cc |
| Warning: | line 608, column 11 Called C++ object pointer is null |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
| 1 | #include "histogram.h" // NOLINT(build/include_inline) | |||
| 2 | #include "base_object-inl.h" | |||
| 3 | #include "histogram-inl.h" | |||
| 4 | #include "memory_tracker-inl.h" | |||
| 5 | #include "node_errors.h" | |||
| 6 | #include "node_external_reference.h" | |||
| 7 | ||||
| 8 | namespace node { | |||
| 9 | ||||
| 10 | using v8::BigInt; | |||
| 11 | using v8::FunctionCallbackInfo; | |||
| 12 | using v8::FunctionTemplate; | |||
| 13 | using v8::Integer; | |||
| 14 | using v8::Local; | |||
| 15 | using v8::Map; | |||
| 16 | using v8::Number; | |||
| 17 | using v8::Object; | |||
| 18 | using v8::String; | |||
| 19 | using v8::Uint32; | |||
| 20 | using v8::Value; | |||
| 21 | ||||
| 22 | Histogram::Histogram(const Options& options) { | |||
| 23 | hdr_histogram* histogram; | |||
| 24 | CHECK_EQ(0, hdr_init(options.lowest,do { if (__builtin_expect(!!(!((0) == (hdr_init(options.lowest , options.highest, options.figures, &histogram)))), 0)) { do { static const node::AssertionInfo args = { "../src/histogram.cc" ":" "27", "(0) == (hdr_init(options.lowest, options.highest, options.figures, &histogram))" , __PRETTY_FUNCTION__ }; node::Assert(args); } while (0); } } while (0) | |||
| 25 | options.highest,do { if (__builtin_expect(!!(!((0) == (hdr_init(options.lowest , options.highest, options.figures, &histogram)))), 0)) { do { static const node::AssertionInfo args = { "../src/histogram.cc" ":" "27", "(0) == (hdr_init(options.lowest, options.highest, options.figures, &histogram))" , __PRETTY_FUNCTION__ }; node::Assert(args); } while (0); } } while (0) | |||
| 26 | options.figures,do { if (__builtin_expect(!!(!((0) == (hdr_init(options.lowest , options.highest, options.figures, &histogram)))), 0)) { do { static const node::AssertionInfo args = { "../src/histogram.cc" ":" "27", "(0) == (hdr_init(options.lowest, options.highest, options.figures, &histogram))" , __PRETTY_FUNCTION__ }; node::Assert(args); } while (0); } } while (0) | |||
| 27 | &histogram))do { if (__builtin_expect(!!(!((0) == (hdr_init(options.lowest , options.highest, options.figures, &histogram)))), 0)) { do { static const node::AssertionInfo args = { "../src/histogram.cc" ":" "27", "(0) == (hdr_init(options.lowest, options.highest, options.figures, &histogram))" , __PRETTY_FUNCTION__ }; node::Assert(args); } while (0); } } while (0); | |||
| 28 | histogram_.reset(histogram); | |||
| 29 | } | |||
| 30 | ||||
| 31 | void Histogram::MemoryInfo(MemoryTracker* tracker) const { | |||
| 32 | tracker->TrackFieldWithSize("histogram", GetMemorySize()); | |||
| 33 | } | |||
| 34 | ||||
| 35 | HistogramImpl::HistogramImpl(const Histogram::Options& options) | |||
| 36 | : histogram_(new Histogram(options)) {} | |||
| 37 | ||||
| 38 | HistogramImpl::HistogramImpl(std::shared_ptr<Histogram> histogram) | |||
| 39 | : histogram_(std::move(histogram)) {} | |||
| 40 | ||||
| 41 | HistogramBase::HistogramBase( | |||
| 42 | Environment* env, | |||
| 43 | Local<Object> wrap, | |||
| 44 | const Histogram::Options& options) | |||
| 45 | : BaseObject(env, wrap), | |||
| 46 | HistogramImpl(options) { | |||
| 47 | MakeWeak(); | |||
| 48 | } | |||
| 49 | ||||
| 50 | HistogramBase::HistogramBase( | |||
| 51 | Environment* env, | |||
| 52 | Local<Object> wrap, | |||
| 53 | std::shared_ptr<Histogram> histogram) | |||
| 54 | : BaseObject(env, wrap), | |||
| 55 | HistogramImpl(std::move(histogram)) { | |||
| 56 | MakeWeak(); | |||
| 57 | } | |||
| 58 | ||||
| 59 | void HistogramBase::MemoryInfo(MemoryTracker* tracker) const { | |||
| 60 | tracker->TrackField("histogram", histogram()); | |||
| 61 | } | |||
| 62 | ||||
| 63 | void HistogramBase::GetCount(const v8::FunctionCallbackInfo<v8::Value>& args) { | |||
| 64 | HistogramBase* histogram; | |||
| 65 | ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder())do { *&histogram = static_cast<typename std::remove_reference <decltype(*&histogram)>::type>( BaseObject::FromJSObject (args.Holder())); if (*&histogram == nullptr) return ; } while (0); | |||
| 66 | double value = static_cast<double>((*histogram)->Count()); | |||
| 67 | args.GetReturnValue().Set(value); | |||
| 68 | } | |||
| 69 | ||||
| 70 | void HistogramBase::GetCountBigInt( | |||
| 71 | const v8::FunctionCallbackInfo<v8::Value>& args) { | |||
| 72 | Environment* env = Environment::GetCurrent(args); | |||
| 73 | HistogramBase* histogram; | |||
| 74 | ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder())do { *&histogram = static_cast<typename std::remove_reference <decltype(*&histogram)>::type>( BaseObject::FromJSObject (args.Holder())); if (*&histogram == nullptr) return ; } while (0); | |||
| 75 | args.GetReturnValue().Set( | |||
| 76 | BigInt::NewFromUnsigned(env->isolate(), (*histogram)->Count())); | |||
| 77 | } | |||
| 78 | ||||
| 79 | void HistogramBase::GetMin(const FunctionCallbackInfo<Value>& args) { | |||
| 80 | HistogramBase* histogram; | |||
| 81 | ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder())do { *&histogram = static_cast<typename std::remove_reference <decltype(*&histogram)>::type>( BaseObject::FromJSObject (args.Holder())); if (*&histogram == nullptr) return ; } while (0); | |||
| 82 | double value = static_cast<double>((*histogram)->Min()); | |||
| 83 | args.GetReturnValue().Set(value); | |||
| 84 | } | |||
| 85 | ||||
| 86 | void HistogramBase::GetMinBigInt(const FunctionCallbackInfo<Value>& args) { | |||
| 87 | Environment* env = Environment::GetCurrent(args); | |||
| 88 | HistogramBase* histogram; | |||
| 89 | ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder())do { *&histogram = static_cast<typename std::remove_reference <decltype(*&histogram)>::type>( BaseObject::FromJSObject (args.Holder())); if (*&histogram == nullptr) return ; } while (0); | |||
| 90 | args.GetReturnValue().Set(BigInt::New(env->isolate(), (*histogram)->Min())); | |||
| 91 | } | |||
| 92 | ||||
| 93 | void HistogramBase::GetMax(const FunctionCallbackInfo<Value>& args) { | |||
| 94 | HistogramBase* histogram; | |||
| 95 | ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder())do { *&histogram = static_cast<typename std::remove_reference <decltype(*&histogram)>::type>( BaseObject::FromJSObject (args.Holder())); if (*&histogram == nullptr) return ; } while (0); | |||
| 96 | double value = static_cast<double>((*histogram)->Max()); | |||
| 97 | args.GetReturnValue().Set(value); | |||
| 98 | } | |||
| 99 | ||||
| 100 | void HistogramBase::GetMaxBigInt(const FunctionCallbackInfo<Value>& args) { | |||
| 101 | Environment* env = Environment::GetCurrent(args); | |||
| 102 | HistogramBase* histogram; | |||
| 103 | ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder())do { *&histogram = static_cast<typename std::remove_reference <decltype(*&histogram)>::type>( BaseObject::FromJSObject (args.Holder())); if (*&histogram == nullptr) return ; } while (0); | |||
| 104 | args.GetReturnValue().Set( | |||
| 105 | BigInt::New(env->isolate(), (*histogram)->Max())); | |||
| 106 | } | |||
| 107 | ||||
| 108 | void HistogramBase::GetMean(const FunctionCallbackInfo<Value>& args) { | |||
| 109 | HistogramBase* histogram; | |||
| 110 | ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder())do { *&histogram = static_cast<typename std::remove_reference <decltype(*&histogram)>::type>( BaseObject::FromJSObject (args.Holder())); if (*&histogram == nullptr) return ; } while (0); | |||
| 111 | args.GetReturnValue().Set((*histogram)->Mean()); | |||
| 112 | } | |||
| 113 | ||||
| 114 | void HistogramBase::GetExceeds(const FunctionCallbackInfo<Value>& args) { | |||
| 115 | HistogramBase* histogram; | |||
| 116 | ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder())do { *&histogram = static_cast<typename std::remove_reference <decltype(*&histogram)>::type>( BaseObject::FromJSObject (args.Holder())); if (*&histogram == nullptr) return ; } while (0); | |||
| 117 | double value = static_cast<double>((*histogram)->Exceeds()); | |||
| 118 | args.GetReturnValue().Set(value); | |||
| 119 | } | |||
| 120 | ||||
| 121 | void HistogramBase::GetExceedsBigInt(const FunctionCallbackInfo<Value>& args) { | |||
| 122 | Environment* env = Environment::GetCurrent(args); | |||
| 123 | HistogramBase* histogram; | |||
| 124 | ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder())do { *&histogram = static_cast<typename std::remove_reference <decltype(*&histogram)>::type>( BaseObject::FromJSObject (args.Holder())); if (*&histogram == nullptr) return ; } while (0); | |||
| 125 | args.GetReturnValue().Set( | |||
| 126 | BigInt::NewFromUnsigned(env->isolate(), (*histogram)->Exceeds())); | |||
| 127 | } | |||
| 128 | ||||
| 129 | void HistogramBase::GetStddev(const FunctionCallbackInfo<Value>& args) { | |||
| 130 | HistogramBase* histogram; | |||
| 131 | ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder())do { *&histogram = static_cast<typename std::remove_reference <decltype(*&histogram)>::type>( BaseObject::FromJSObject (args.Holder())); if (*&histogram == nullptr) return ; } while (0); | |||
| 132 | args.GetReturnValue().Set((*histogram)->Stddev()); | |||
| 133 | } | |||
| 134 | ||||
| 135 | void HistogramBase::GetPercentile(const FunctionCallbackInfo<Value>& args) { | |||
| 136 | HistogramBase* histogram; | |||
| 137 | ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder())do { *&histogram = static_cast<typename std::remove_reference <decltype(*&histogram)>::type>( BaseObject::FromJSObject (args.Holder())); if (*&histogram == nullptr) return ; } while (0); | |||
| 138 | CHECK(args[0]->IsNumber())do { if (__builtin_expect(!!(!(args[0]->IsNumber())), 0)) { do { static const node::AssertionInfo args = { "../src/histogram.cc" ":" "138", "args[0]->IsNumber()", __PRETTY_FUNCTION__ }; node ::Assert(args); } while (0); } } while (0); | |||
| 139 | double percentile = args[0].As<Number>()->Value(); | |||
| 140 | double value = static_cast<double>((*histogram)->Percentile(percentile)); | |||
| 141 | args.GetReturnValue().Set(value); | |||
| 142 | } | |||
| 143 | ||||
| 144 | void HistogramBase::GetPercentileBigInt( | |||
| 145 | const FunctionCallbackInfo<Value>& args) { | |||
| 146 | Environment* env = Environment::GetCurrent(args); | |||
| 147 | HistogramBase* histogram; | |||
| 148 | ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder())do { *&histogram = static_cast<typename std::remove_reference <decltype(*&histogram)>::type>( BaseObject::FromJSObject (args.Holder())); if (*&histogram == nullptr) return ; } while (0); | |||
| 149 | CHECK(args[0]->IsNumber())do { if (__builtin_expect(!!(!(args[0]->IsNumber())), 0)) { do { static const node::AssertionInfo args = { "../src/histogram.cc" ":" "149", "args[0]->IsNumber()", __PRETTY_FUNCTION__ }; node ::Assert(args); } while (0); } } while (0); | |||
| 150 | double percentile = args[0].As<Number>()->Value(); | |||
| 151 | int64_t value = (*histogram)->Percentile(percentile); | |||
| 152 | args.GetReturnValue().Set(BigInt::New(env->isolate(), value)); | |||
| 153 | } | |||
| 154 | ||||
| 155 | void HistogramBase::GetPercentiles(const FunctionCallbackInfo<Value>& args) { | |||
| 156 | Environment* env = Environment::GetCurrent(args); | |||
| 157 | HistogramBase* histogram; | |||
| 158 | ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder())do { *&histogram = static_cast<typename std::remove_reference <decltype(*&histogram)>::type>( BaseObject::FromJSObject (args.Holder())); if (*&histogram == nullptr) return ; } while (0); | |||
| 159 | CHECK(args[0]->IsMap())do { if (__builtin_expect(!!(!(args[0]->IsMap())), 0)) { do { static const node::AssertionInfo args = { "../src/histogram.cc" ":" "159", "args[0]->IsMap()", __PRETTY_FUNCTION__ }; node ::Assert(args); } while (0); } } while (0); | |||
| 160 | Local<Map> map = args[0].As<Map>(); | |||
| 161 | (*histogram)->Percentiles([map, env](double key, int64_t value) { | |||
| 162 | USE(map->Set( | |||
| 163 | env->context(), | |||
| 164 | Number::New(env->isolate(), key), | |||
| 165 | Number::New(env->isolate(), static_cast<double>(value)))); | |||
| 166 | }); | |||
| 167 | } | |||
| 168 | ||||
| 169 | void HistogramBase::GetPercentilesBigInt( | |||
| 170 | const FunctionCallbackInfo<Value>& args) { | |||
| 171 | Environment* env = Environment::GetCurrent(args); | |||
| 172 | HistogramBase* histogram; | |||
| 173 | ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder())do { *&histogram = static_cast<typename std::remove_reference <decltype(*&histogram)>::type>( BaseObject::FromJSObject (args.Holder())); if (*&histogram == nullptr) return ; } while (0); | |||
| 174 | CHECK(args[0]->IsMap())do { if (__builtin_expect(!!(!(args[0]->IsMap())), 0)) { do { static const node::AssertionInfo args = { "../src/histogram.cc" ":" "174", "args[0]->IsMap()", __PRETTY_FUNCTION__ }; node ::Assert(args); } while (0); } } while (0); | |||
| 175 | Local<Map> map = args[0].As<Map>(); | |||
| 176 | (*histogram)->Percentiles([map, env](double key, int64_t value) { | |||
| 177 | USE(map->Set( | |||
| 178 | env->context(), | |||
| 179 | Number::New(env->isolate(), key), | |||
| 180 | BigInt::New(env->isolate(), value))); | |||
| 181 | }); | |||
| 182 | } | |||
| 183 | ||||
| 184 | void HistogramBase::DoReset(const FunctionCallbackInfo<Value>& args) { | |||
| 185 | HistogramBase* histogram; | |||
| 186 | ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder())do { *&histogram = static_cast<typename std::remove_reference <decltype(*&histogram)>::type>( BaseObject::FromJSObject (args.Holder())); if (*&histogram == nullptr) return ; } while (0); | |||
| 187 | (*histogram)->Reset(); | |||
| 188 | } | |||
| 189 | ||||
| 190 | void HistogramBase::RecordDelta(const FunctionCallbackInfo<Value>& args) { | |||
| 191 | HistogramBase* histogram; | |||
| 192 | ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder())do { *&histogram = static_cast<typename std::remove_reference <decltype(*&histogram)>::type>( BaseObject::FromJSObject (args.Holder())); if (*&histogram == nullptr) return ; } while (0); | |||
| 193 | (*histogram)->RecordDelta(); | |||
| 194 | } | |||
| 195 | ||||
| 196 | void HistogramBase::Record(const FunctionCallbackInfo<Value>& args) { | |||
| 197 | Environment* env = Environment::GetCurrent(args); | |||
| 198 | CHECK_IMPLIES(!args[0]->IsNumber(), args[0]->IsBigInt())do { if (__builtin_expect(!!(!(!(!args[0]->IsNumber()) || ( args[0]->IsBigInt()))), 0)) { do { static const node::AssertionInfo args = { "../src/histogram.cc" ":" "198", "!(!args[0]->IsNumber()) || (args[0]->IsBigInt())" , __PRETTY_FUNCTION__ }; node::Assert(args); } while (0); } } while (0); | |||
| 199 | bool lossless = true; | |||
| 200 | int64_t value = args[0]->IsBigInt() | |||
| 201 | ? args[0].As<BigInt>()->Int64Value(&lossless) | |||
| 202 | : static_cast<int64_t>(args[0].As<Number>()->Value()); | |||
| 203 | if (!lossless || value < 1) | |||
| 204 | return THROW_ERR_OUT_OF_RANGE(env, "value is out of range"); | |||
| 205 | HistogramBase* histogram; | |||
| 206 | ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder())do { *&histogram = static_cast<typename std::remove_reference <decltype(*&histogram)>::type>( BaseObject::FromJSObject (args.Holder())); if (*&histogram == nullptr) return ; } while (0); | |||
| 207 | (*histogram)->Record(value); | |||
| 208 | } | |||
| 209 | ||||
| 210 | void HistogramBase::Add(const FunctionCallbackInfo<Value>& args) { | |||
| 211 | Environment* env = Environment::GetCurrent(args); | |||
| 212 | HistogramBase* histogram; | |||
| 213 | ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder())do { *&histogram = static_cast<typename std::remove_reference <decltype(*&histogram)>::type>( BaseObject::FromJSObject (args.Holder())); if (*&histogram == nullptr) return ; } while (0); | |||
| 214 | ||||
| 215 | CHECK(GetConstructorTemplate(env)->HasInstance(args[0]))do { if (__builtin_expect(!!(!(GetConstructorTemplate(env)-> HasInstance(args[0]))), 0)) { do { static const node::AssertionInfo args = { "../src/histogram.cc" ":" "215", "GetConstructorTemplate(env)->HasInstance(args[0])" , __PRETTY_FUNCTION__ }; node::Assert(args); } while (0); } } while (0); | |||
| 216 | HistogramBase* other; | |||
| 217 | ASSIGN_OR_RETURN_UNWRAP(&other, args[0])do { *&other = static_cast<typename std::remove_reference <decltype(*&other)>::type>( BaseObject::FromJSObject (args[0])); if (*&other == nullptr) return ; } while (0); | |||
| 218 | ||||
| 219 | double count = (*histogram)->Add(*(other->histogram())); | |||
| 220 | args.GetReturnValue().Set(count); | |||
| 221 | } | |||
| 222 | ||||
| 223 | BaseObjectPtr<HistogramBase> HistogramBase::Create( | |||
| 224 | Environment* env, | |||
| 225 | const Histogram::Options& options) { | |||
| 226 | Local<Object> obj; | |||
| 227 | if (!GetConstructorTemplate(env) | |||
| 228 | ->InstanceTemplate() | |||
| 229 | ->NewInstance(env->context()).ToLocal(&obj)) { | |||
| 230 | return BaseObjectPtr<HistogramBase>(); | |||
| 231 | } | |||
| 232 | ||||
| 233 | return MakeBaseObject<HistogramBase>(env, obj, options); | |||
| 234 | } | |||
| 235 | ||||
| 236 | BaseObjectPtr<HistogramBase> HistogramBase::Create( | |||
| 237 | Environment* env, | |||
| 238 | std::shared_ptr<Histogram> histogram) { | |||
| 239 | Local<Object> obj; | |||
| 240 | if (!GetConstructorTemplate(env) | |||
| 241 | ->InstanceTemplate() | |||
| 242 | ->NewInstance(env->context()).ToLocal(&obj)) { | |||
| 243 | return BaseObjectPtr<HistogramBase>(); | |||
| 244 | } | |||
| 245 | return MakeBaseObject<HistogramBase>(env, obj, std::move(histogram)); | |||
| 246 | } | |||
| 247 | ||||
| 248 | void HistogramBase::New(const FunctionCallbackInfo<Value>& args) { | |||
| 249 | CHECK(args.IsConstructCall())do { if (__builtin_expect(!!(!(args.IsConstructCall())), 0)) { do { static const node::AssertionInfo args = { "../src/histogram.cc" ":" "249", "args.IsConstructCall()", __PRETTY_FUNCTION__ }; node ::Assert(args); } while (0); } } while (0); | |||
| 250 | Environment* env = Environment::GetCurrent(args); | |||
| 251 | ||||
| 252 | CHECK_IMPLIES(!args[0]->IsNumber(), args[0]->IsBigInt())do { if (__builtin_expect(!!(!(!(!args[0]->IsNumber()) || ( args[0]->IsBigInt()))), 0)) { do { static const node::AssertionInfo args = { "../src/histogram.cc" ":" "252", "!(!args[0]->IsNumber()) || (args[0]->IsBigInt())" , __PRETTY_FUNCTION__ }; node::Assert(args); } while (0); } } while (0); | |||
| 253 | CHECK_IMPLIES(!args[1]->IsNumber(), args[1]->IsBigInt())do { if (__builtin_expect(!!(!(!(!args[1]->IsNumber()) || ( args[1]->IsBigInt()))), 0)) { do { static const node::AssertionInfo args = { "../src/histogram.cc" ":" "253", "!(!args[1]->IsNumber()) || (args[1]->IsBigInt())" , __PRETTY_FUNCTION__ }; node::Assert(args); } while (0); } } while (0); | |||
| 254 | CHECK(args[2]->IsUint32())do { if (__builtin_expect(!!(!(args[2]->IsUint32())), 0)) { do { static const node::AssertionInfo args = { "../src/histogram.cc" ":" "254", "args[2]->IsUint32()", __PRETTY_FUNCTION__ }; node ::Assert(args); } while (0); } } while (0); | |||
| 255 | ||||
| 256 | int64_t lowest = 1; | |||
| 257 | int64_t highest = std::numeric_limits<int64_t>::max(); | |||
| 258 | ||||
| 259 | bool lossless_ignored; | |||
| 260 | ||||
| 261 | if (args[0]->IsNumber()) { | |||
| 262 | lowest = args[0].As<Integer>()->Value(); | |||
| 263 | } else if (args[0]->IsBigInt()) { | |||
| 264 | lowest = args[0].As<BigInt>()->Int64Value(&lossless_ignored); | |||
| 265 | } | |||
| 266 | ||||
| 267 | if (args[1]->IsNumber()) { | |||
| 268 | highest = args[1].As<Integer>()->Value(); | |||
| 269 | } else if (args[1]->IsBigInt()) { | |||
| 270 | highest = args[1].As<BigInt>()->Int64Value(&lossless_ignored); | |||
| 271 | } | |||
| 272 | ||||
| 273 | int32_t figures = args[2].As<Uint32>()->Value(); | |||
| 274 | new HistogramBase(env, args.This(), Histogram::Options { | |||
| 275 | lowest, highest, figures | |||
| 276 | }); | |||
| 277 | } | |||
| 278 | ||||
| 279 | Local<FunctionTemplate> HistogramBase::GetConstructorTemplate( | |||
| 280 | Environment* env) { | |||
| 281 | Local<FunctionTemplate> tmpl = env->histogram_ctor_template(); | |||
| 282 | if (tmpl.IsEmpty()) { | |||
| 283 | tmpl = env->NewFunctionTemplate(New); | |||
| 284 | Local<String> classname = | |||
| 285 | FIXED_ONE_BYTE_STRING(env->isolate(), "Histogram"); | |||
| 286 | tmpl->SetClassName(classname); | |||
| 287 | tmpl->Inherit(BaseObject::GetConstructorTemplate(env)); | |||
| 288 | ||||
| 289 | tmpl->InstanceTemplate()->SetInternalFieldCount( | |||
| 290 | HistogramBase::kInternalFieldCount); | |||
| 291 | env->SetProtoMethodNoSideEffect(tmpl, "count", GetCount); | |||
| 292 | env->SetProtoMethodNoSideEffect(tmpl, "countBigInt", GetCountBigInt); | |||
| 293 | env->SetProtoMethodNoSideEffect(tmpl, "exceeds", GetExceeds); | |||
| 294 | env->SetProtoMethodNoSideEffect(tmpl, "exceedsBigInt", GetExceedsBigInt); | |||
| 295 | env->SetProtoMethodNoSideEffect(tmpl, "min", GetMin); | |||
| 296 | env->SetProtoMethodNoSideEffect(tmpl, "minBigInt", GetMinBigInt); | |||
| 297 | env->SetProtoMethodNoSideEffect(tmpl, "max", GetMax); | |||
| 298 | env->SetProtoMethodNoSideEffect(tmpl, "maxBigInt", GetMaxBigInt); | |||
| 299 | env->SetProtoMethodNoSideEffect(tmpl, "mean", GetMean); | |||
| 300 | env->SetProtoMethodNoSideEffect(tmpl, "stddev", GetStddev); | |||
| 301 | env->SetProtoMethodNoSideEffect(tmpl, "percentile", GetPercentile); | |||
| 302 | env->SetProtoMethodNoSideEffect(tmpl, "percentileBigInt", | |||
| 303 | GetPercentileBigInt); | |||
| 304 | env->SetProtoMethodNoSideEffect(tmpl, "percentiles", GetPercentiles); | |||
| 305 | env->SetProtoMethodNoSideEffect(tmpl, "percentilesBigInt", | |||
| 306 | GetPercentilesBigInt); | |||
| 307 | env->SetProtoMethod(tmpl, "reset", DoReset); | |||
| 308 | env->SetProtoMethod(tmpl, "record", Record); | |||
| 309 | env->SetProtoMethod(tmpl, "recordDelta", RecordDelta); | |||
| 310 | env->SetProtoMethod(tmpl, "add", Add); | |||
| 311 | env->set_histogram_ctor_template(tmpl); | |||
| 312 | } | |||
| 313 | return tmpl; | |||
| 314 | } | |||
| 315 | ||||
| 316 | void HistogramBase::RegisterExternalReferences( | |||
| 317 | ExternalReferenceRegistry* registry) { | |||
| 318 | registry->Register(New); | |||
| 319 | registry->Register(GetCount); | |||
| 320 | registry->Register(GetCountBigInt); | |||
| 321 | registry->Register(GetExceeds); | |||
| 322 | registry->Register(GetExceedsBigInt); | |||
| 323 | registry->Register(GetMin); | |||
| 324 | registry->Register(GetMinBigInt); | |||
| 325 | registry->Register(GetMax); | |||
| 326 | registry->Register(GetMaxBigInt); | |||
| 327 | registry->Register(GetMean); | |||
| 328 | registry->Register(GetStddev); | |||
| 329 | registry->Register(GetPercentile); | |||
| 330 | registry->Register(GetPercentileBigInt); | |||
| 331 | registry->Register(GetPercentiles); | |||
| 332 | registry->Register(GetPercentilesBigInt); | |||
| 333 | registry->Register(DoReset); | |||
| 334 | registry->Register(Record); | |||
| 335 | registry->Register(RecordDelta); | |||
| 336 | registry->Register(Add); | |||
| 337 | } | |||
| 338 | ||||
| 339 | void HistogramBase::Initialize(Environment* env, Local<Object> target) { | |||
| 340 | env->SetConstructorFunction(target, "Histogram", GetConstructorTemplate(env)); | |||
| 341 | } | |||
| 342 | ||||
| 343 | BaseObjectPtr<BaseObject> HistogramBase::HistogramTransferData::Deserialize( | |||
| 344 | Environment* env, | |||
| 345 | v8::Local<v8::Context> context, | |||
| 346 | std::unique_ptr<worker::TransferData> self) { | |||
| 347 | return Create(env, std::move(histogram_)); | |||
| 348 | } | |||
| 349 | ||||
| 350 | std::unique_ptr<worker::TransferData> HistogramBase::CloneForMessaging() const { | |||
| 351 | return std::make_unique<HistogramTransferData>(this); | |||
| 352 | } | |||
| 353 | ||||
| 354 | void HistogramBase::HistogramTransferData::MemoryInfo( | |||
| 355 | MemoryTracker* tracker) const { | |||
| 356 | tracker->TrackField("histogram", histogram_); | |||
| 357 | } | |||
| 358 | ||||
| 359 | Local<FunctionTemplate> IntervalHistogram::GetConstructorTemplate( | |||
| 360 | Environment* env) { | |||
| 361 | Local<FunctionTemplate> tmpl = env->intervalhistogram_constructor_template(); | |||
| 362 | if (tmpl.IsEmpty()) { | |||
| 363 | tmpl = FunctionTemplate::New(env->isolate()); | |||
| 364 | tmpl->Inherit(HandleWrap::GetConstructorTemplate(env)); | |||
| 365 | tmpl->InstanceTemplate()->SetInternalFieldCount( | |||
| 366 | HistogramBase::kInternalFieldCount); | |||
| 367 | env->SetProtoMethodNoSideEffect(tmpl, "count", GetCount); | |||
| 368 | env->SetProtoMethodNoSideEffect(tmpl, "countBigInt", GetCountBigInt); | |||
| 369 | env->SetProtoMethodNoSideEffect(tmpl, "exceeds", GetExceeds); | |||
| 370 | env->SetProtoMethodNoSideEffect(tmpl, "exceedsBigInt", GetExceedsBigInt); | |||
| 371 | env->SetProtoMethodNoSideEffect(tmpl, "min", GetMin); | |||
| 372 | env->SetProtoMethodNoSideEffect(tmpl, "minBigInt", GetMinBigInt); | |||
| 373 | env->SetProtoMethodNoSideEffect(tmpl, "max", GetMax); | |||
| 374 | env->SetProtoMethodNoSideEffect(tmpl, "maxBigInt", GetMaxBigInt); | |||
| 375 | env->SetProtoMethodNoSideEffect(tmpl, "mean", GetMean); | |||
| 376 | env->SetProtoMethodNoSideEffect(tmpl, "stddev", GetStddev); | |||
| 377 | env->SetProtoMethodNoSideEffect(tmpl, "percentile", GetPercentile); | |||
| 378 | env->SetProtoMethodNoSideEffect(tmpl, "percentileBigInt", | |||
| 379 | GetPercentileBigInt); | |||
| 380 | env->SetProtoMethodNoSideEffect(tmpl, "percentiles", GetPercentiles); | |||
| 381 | env->SetProtoMethodNoSideEffect(tmpl, "percentilesBigInt", | |||
| 382 | GetPercentilesBigInt); | |||
| 383 | env->SetProtoMethod(tmpl, "reset", DoReset); | |||
| 384 | env->SetProtoMethod(tmpl, "start", Start); | |||
| 385 | env->SetProtoMethod(tmpl, "stop", Stop); | |||
| 386 | env->set_intervalhistogram_constructor_template(tmpl); | |||
| 387 | } | |||
| 388 | return tmpl; | |||
| 389 | } | |||
| 390 | ||||
| 391 | void IntervalHistogram::RegisterExternalReferences( | |||
| 392 | ExternalReferenceRegistry* registry) { | |||
| 393 | registry->Register(GetCount); | |||
| 394 | registry->Register(GetCountBigInt); | |||
| 395 | registry->Register(GetExceeds); | |||
| 396 | registry->Register(GetExceedsBigInt); | |||
| 397 | registry->Register(GetMin); | |||
| 398 | registry->Register(GetMinBigInt); | |||
| 399 | registry->Register(GetMax); | |||
| 400 | registry->Register(GetMaxBigInt); | |||
| 401 | registry->Register(GetMean); | |||
| 402 | registry->Register(GetStddev); | |||
| 403 | registry->Register(GetPercentile); | |||
| 404 | registry->Register(GetPercentileBigInt); | |||
| 405 | registry->Register(GetPercentiles); | |||
| 406 | registry->Register(GetPercentilesBigInt); | |||
| 407 | registry->Register(DoReset); | |||
| 408 | registry->Register(Start); | |||
| 409 | registry->Register(Stop); | |||
| 410 | } | |||
| 411 | ||||
| 412 | IntervalHistogram::IntervalHistogram( | |||
| 413 | Environment* env, | |||
| 414 | Local<Object> wrap, | |||
| 415 | AsyncWrap::ProviderType type, | |||
| 416 | int32_t interval, | |||
| 417 | std::function<void(Histogram&)> on_interval, | |||
| 418 | const Histogram::Options& options) | |||
| 419 | : HandleWrap( | |||
| 420 | env, | |||
| 421 | wrap, | |||
| 422 | reinterpret_cast<uv_handle_t*>(&timer_), | |||
| 423 | type), | |||
| 424 | HistogramImpl(options), | |||
| 425 | interval_(interval), | |||
| 426 | on_interval_(std::move(on_interval)) { | |||
| 427 | MakeWeak(); | |||
| 428 | uv_timer_init(env->event_loop(), &timer_); | |||
| 429 | } | |||
| 430 | ||||
| 431 | BaseObjectPtr<IntervalHistogram> IntervalHistogram::Create( | |||
| 432 | Environment* env, | |||
| 433 | int32_t interval, | |||
| 434 | std::function<void(Histogram&)> on_interval, | |||
| 435 | const Histogram::Options& options) { | |||
| 436 | Local<Object> obj; | |||
| 437 | if (!GetConstructorTemplate(env) | |||
| 438 | ->InstanceTemplate() | |||
| 439 | ->NewInstance(env->context()).ToLocal(&obj)) { | |||
| 440 | return BaseObjectPtr<IntervalHistogram>(); | |||
| 441 | } | |||
| 442 | ||||
| 443 | return MakeBaseObject<IntervalHistogram>( | |||
| 444 | env, | |||
| 445 | obj, | |||
| 446 | AsyncWrap::PROVIDER_ELDHISTOGRAM, | |||
| 447 | interval, | |||
| 448 | std::move(on_interval), | |||
| 449 | options); | |||
| 450 | } | |||
| 451 | ||||
| 452 | void IntervalHistogram::TimerCB(uv_timer_t* handle) { | |||
| 453 | IntervalHistogram* histogram = | |||
| 454 | ContainerOf(&IntervalHistogram::timer_, handle); | |||
| 455 | ||||
| 456 | Histogram* h = histogram->histogram().get(); | |||
| 457 | ||||
| 458 | histogram->on_interval_(*h); | |||
| 459 | } | |||
| 460 | ||||
| 461 | void IntervalHistogram::MemoryInfo(MemoryTracker* tracker) const { | |||
| 462 | tracker->TrackField("histogram", histogram()); | |||
| 463 | } | |||
| 464 | ||||
| 465 | void IntervalHistogram::OnStart(StartFlags flags) { | |||
| 466 | if (enabled_ || IsHandleClosing()) return; | |||
| 467 | enabled_ = true; | |||
| 468 | if (flags == StartFlags::RESET) | |||
| 469 | histogram()->Reset(); | |||
| 470 | uv_timer_start(&timer_, TimerCB, interval_, interval_); | |||
| 471 | uv_unref(reinterpret_cast<uv_handle_t*>(&timer_)); | |||
| 472 | } | |||
| 473 | ||||
| 474 | void IntervalHistogram::OnStop() { | |||
| 475 | if (!enabled_ || IsHandleClosing()) return; | |||
| 476 | enabled_ = false; | |||
| 477 | uv_timer_stop(&timer_); | |||
| 478 | } | |||
| 479 | ||||
| 480 | void IntervalHistogram::Start(const FunctionCallbackInfo<Value>& args) { | |||
| 481 | IntervalHistogram* histogram; | |||
| 482 | ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder())do { *&histogram = static_cast<typename std::remove_reference <decltype(*&histogram)>::type>( BaseObject::FromJSObject (args.Holder())); if (*&histogram == nullptr) return ; } while (0); | |||
| 483 | histogram->OnStart(args[0]->IsTrue() ? StartFlags::RESET : StartFlags::NONE); | |||
| 484 | } | |||
| 485 | ||||
| 486 | void IntervalHistogram::Stop(const FunctionCallbackInfo<Value>& args) { | |||
| 487 | IntervalHistogram* histogram; | |||
| 488 | ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder())do { *&histogram = static_cast<typename std::remove_reference <decltype(*&histogram)>::type>( BaseObject::FromJSObject (args.Holder())); if (*&histogram == nullptr) return ; } while (0); | |||
| 489 | histogram->OnStop(); | |||
| 490 | } | |||
| 491 | ||||
| 492 | void IntervalHistogram::GetCount(const FunctionCallbackInfo<Value>& args) { | |||
| 493 | IntervalHistogram* histogram; | |||
| 494 | ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder())do { *&histogram = static_cast<typename std::remove_reference <decltype(*&histogram)>::type>( BaseObject::FromJSObject (args.Holder())); if (*&histogram == nullptr) return ; } while (0); | |||
| 495 | double value = static_cast<double>((*histogram)->Count()); | |||
| 496 | args.GetReturnValue().Set(value); | |||
| 497 | } | |||
| 498 | ||||
| 499 | void IntervalHistogram::GetCountBigInt( | |||
| 500 | const v8::FunctionCallbackInfo<v8::Value>& args) { | |||
| 501 | Environment* env = Environment::GetCurrent(args); | |||
| 502 | IntervalHistogram* histogram; | |||
| 503 | ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder())do { *&histogram = static_cast<typename std::remove_reference <decltype(*&histogram)>::type>( BaseObject::FromJSObject (args.Holder())); if (*&histogram == nullptr) return ; } while (0); | |||
| 504 | args.GetReturnValue().Set( | |||
| 505 | BigInt::NewFromUnsigned(env->isolate(), (*histogram)->Count())); | |||
| 506 | } | |||
| 507 | ||||
| 508 | void IntervalHistogram::GetMin(const FunctionCallbackInfo<Value>& args) { | |||
| 509 | IntervalHistogram* histogram; | |||
| 510 | ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder())do { *&histogram = static_cast<typename std::remove_reference <decltype(*&histogram)>::type>( BaseObject::FromJSObject (args.Holder())); if (*&histogram == nullptr) return ; } while (0); | |||
| 511 | double value = static_cast<double>((*histogram)->Min()); | |||
| 512 | args.GetReturnValue().Set(value); | |||
| 513 | } | |||
| 514 | ||||
| 515 | void IntervalHistogram::GetMinBigInt(const FunctionCallbackInfo<Value>& args) { | |||
| 516 | Environment* env = Environment::GetCurrent(args); | |||
| 517 | IntervalHistogram* histogram; | |||
| 518 | ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder())do { *&histogram = static_cast<typename std::remove_reference <decltype(*&histogram)>::type>( BaseObject::FromJSObject (args.Holder())); if (*&histogram == nullptr) return ; } while (0); | |||
| 519 | args.GetReturnValue().Set(BigInt::New(env->isolate(), (*histogram)->Min())); | |||
| 520 | } | |||
| 521 | ||||
| 522 | void IntervalHistogram::GetMax(const FunctionCallbackInfo<Value>& args) { | |||
| 523 | IntervalHistogram* histogram; | |||
| 524 | ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder())do { *&histogram = static_cast<typename std::remove_reference <decltype(*&histogram)>::type>( BaseObject::FromJSObject (args.Holder())); if (*&histogram == nullptr) return ; } while (0); | |||
| 525 | double value = static_cast<double>((*histogram)->Max()); | |||
| 526 | args.GetReturnValue().Set(value); | |||
| 527 | } | |||
| 528 | ||||
| 529 | void IntervalHistogram::GetMaxBigInt(const FunctionCallbackInfo<Value>& args) { | |||
| 530 | Environment* env = Environment::GetCurrent(args); | |||
| 531 | IntervalHistogram* histogram; | |||
| 532 | ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder())do { *&histogram = static_cast<typename std::remove_reference <decltype(*&histogram)>::type>( BaseObject::FromJSObject (args.Holder())); if (*&histogram == nullptr) return ; } while (0); | |||
| 533 | args.GetReturnValue().Set(BigInt::New(env->isolate(), (*histogram)->Min())); | |||
| 534 | } | |||
| 535 | ||||
| 536 | void IntervalHistogram::GetMean(const FunctionCallbackInfo<Value>& args) { | |||
| 537 | IntervalHistogram* histogram; | |||
| 538 | ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder())do { *&histogram = static_cast<typename std::remove_reference <decltype(*&histogram)>::type>( BaseObject::FromJSObject (args.Holder())); if (*&histogram == nullptr) return ; } while (0); | |||
| 539 | args.GetReturnValue().Set((*histogram)->Mean()); | |||
| 540 | } | |||
| 541 | ||||
| 542 | void IntervalHistogram::GetExceeds(const FunctionCallbackInfo<Value>& args) { | |||
| 543 | IntervalHistogram* histogram; | |||
| 544 | ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder())do { *&histogram = static_cast<typename std::remove_reference <decltype(*&histogram)>::type>( BaseObject::FromJSObject (args.Holder())); if (*&histogram == nullptr) return ; } while (0); | |||
| 545 | double value = static_cast<double>((*histogram)->Exceeds()); | |||
| 546 | args.GetReturnValue().Set(value); | |||
| 547 | } | |||
| 548 | ||||
| 549 | void IntervalHistogram::GetExceedsBigInt( | |||
| 550 | const FunctionCallbackInfo<Value>& args) { | |||
| 551 | Environment* env = Environment::GetCurrent(args); | |||
| 552 | IntervalHistogram* histogram; | |||
| 553 | ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder())do { *&histogram = static_cast<typename std::remove_reference <decltype(*&histogram)>::type>( BaseObject::FromJSObject (args.Holder())); if (*&histogram == nullptr) return ; } while (0); | |||
| 554 | args.GetReturnValue().Set( | |||
| 555 | BigInt::New(env->isolate(), (*histogram)->Exceeds())); | |||
| 556 | } | |||
| 557 | ||||
| 558 | void IntervalHistogram::GetStddev(const FunctionCallbackInfo<Value>& args) { | |||
| 559 | IntervalHistogram* histogram; | |||
| 560 | ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder())do { *&histogram = static_cast<typename std::remove_reference <decltype(*&histogram)>::type>( BaseObject::FromJSObject (args.Holder())); if (*&histogram == nullptr) return ; } while (0); | |||
| 561 | args.GetReturnValue().Set((*histogram)->Stddev()); | |||
| 562 | } | |||
| 563 | ||||
| 564 | void IntervalHistogram::GetPercentile(const FunctionCallbackInfo<Value>& args) { | |||
| 565 | IntervalHistogram* histogram; | |||
| 566 | ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder())do { *&histogram = static_cast<typename std::remove_reference <decltype(*&histogram)>::type>( BaseObject::FromJSObject (args.Holder())); if (*&histogram == nullptr) return ; } while (0); | |||
| 567 | CHECK(args[0]->IsNumber())do { if (__builtin_expect(!!(!(args[0]->IsNumber())), 0)) { do { static const node::AssertionInfo args = { "../src/histogram.cc" ":" "567", "args[0]->IsNumber()", __PRETTY_FUNCTION__ }; node ::Assert(args); } while (0); } } while (0); | |||
| 568 | double percentile = args[0].As<Number>()->Value(); | |||
| 569 | double value = static_cast<double>((*histogram)->Percentile(percentile)); | |||
| 570 | args.GetReturnValue().Set(value); | |||
| 571 | } | |||
| 572 | ||||
| 573 | void IntervalHistogram::GetPercentileBigInt( | |||
| 574 | const FunctionCallbackInfo<Value>& args) { | |||
| 575 | Environment* env = Environment::GetCurrent(args); | |||
| 576 | IntervalHistogram* histogram; | |||
| 577 | ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder())do { *&histogram = static_cast<typename std::remove_reference <decltype(*&histogram)>::type>( BaseObject::FromJSObject (args.Holder())); if (*&histogram == nullptr) return ; } while (0); | |||
| 578 | CHECK(args[0]->IsNumber())do { if (__builtin_expect(!!(!(args[0]->IsNumber())), 0)) { do { static const node::AssertionInfo args = { "../src/histogram.cc" ":" "578", "args[0]->IsNumber()", __PRETTY_FUNCTION__ }; node ::Assert(args); } while (0); } } while (0); | |||
| 579 | double percentile = args[0].As<Number>()->Value(); | |||
| 580 | int64_t value = (*histogram)->Percentile(percentile); | |||
| 581 | args.GetReturnValue().Set(BigInt::New(env->isolate(), value)); | |||
| 582 | } | |||
| 583 | ||||
| 584 | void IntervalHistogram::GetPercentiles( | |||
| 585 | const FunctionCallbackInfo<Value>& args) { | |||
| 586 | Environment* env = Environment::GetCurrent(args); | |||
| 587 | IntervalHistogram* histogram; | |||
| 588 | ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder())do { *&histogram = static_cast<typename std::remove_reference <decltype(*&histogram)>::type>( BaseObject::FromJSObject (args.Holder())); if (*&histogram == nullptr) return ; } while (0); | |||
| 589 | CHECK(args[0]->IsMap())do { if (__builtin_expect(!!(!(args[0]->IsMap())), 0)) { do { static const node::AssertionInfo args = { "../src/histogram.cc" ":" "589", "args[0]->IsMap()", __PRETTY_FUNCTION__ }; node ::Assert(args); } while (0); } } while (0); | |||
| 590 | Local<Map> map = args[0].As<Map>(); | |||
| 591 | (*histogram)->Percentiles([map, env](double key, int64_t value) { | |||
| 592 | USE(map->Set( | |||
| 593 | env->context(), | |||
| 594 | Number::New(env->isolate(), key), | |||
| 595 | Number::New(env->isolate(), static_cast<double>(value)))); | |||
| 596 | }); | |||
| 597 | } | |||
| 598 | ||||
| 599 | void IntervalHistogram::GetPercentilesBigInt( | |||
| 600 | const FunctionCallbackInfo<Value>& args) { | |||
| 601 | Environment* env = Environment::GetCurrent(args); | |||
| 602 | IntervalHistogram* histogram; | |||
| 603 | ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder())do { *&histogram = static_cast<typename std::remove_reference <decltype(*&histogram)>::type>( BaseObject::FromJSObject (args.Holder())); if (*&histogram == nullptr) return ; } while (0); | |||
| ||||
| 604 | CHECK(args[0]->IsMap())do { if (__builtin_expect(!!(!(args[0]->IsMap())), 0)) { do { static const node::AssertionInfo args = { "../src/histogram.cc" ":" "604", "args[0]->IsMap()", __PRETTY_FUNCTION__ }; node ::Assert(args); } while (0); } } while (0); | |||
| 605 | Local<Map> map = args[0].As<Map>(); | |||
| 606 | (*histogram)->Percentiles([map, env](double key, int64_t value) { | |||
| 607 | USE(map->Set( | |||
| 608 | env->context(), | |||
| ||||
| 609 | Number::New(env->isolate(), key), | |||
| 610 | BigInt::New(env->isolate(), value))); | |||
| 611 | }); | |||
| 612 | } | |||
| 613 | ||||
| 614 | void IntervalHistogram::DoReset(const FunctionCallbackInfo<Value>& args) { | |||
| 615 | IntervalHistogram* histogram; | |||
| 616 | ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder())do { *&histogram = static_cast<typename std::remove_reference <decltype(*&histogram)>::type>( BaseObject::FromJSObject (args.Holder())); if (*&histogram == nullptr) return ; } while (0); | |||
| 617 | (*histogram)->Reset(); | |||
| 618 | } | |||
| 619 | ||||
| 620 | std::unique_ptr<worker::TransferData> | |||
| 621 | IntervalHistogram::CloneForMessaging() const { | |||
| 622 | return std::make_unique<HistogramBase::HistogramTransferData>(histogram()); | |||
| 623 | } | |||
| 624 | ||||
| 625 | } // namespace node |
| 1 | #ifndef SRC_HISTOGRAM_INL_H_ |
| 2 | #define SRC_HISTOGRAM_INL_H_ |
| 3 | |
| 4 | #if defined(NODE_WANT_INTERNALS1) && NODE_WANT_INTERNALS1 |
| 5 | |
| 6 | #include "histogram.h" |
| 7 | #include "base_object-inl.h" |
| 8 | #include "node_internals.h" |
| 9 | |
| 10 | namespace node { |
| 11 | |
| 12 | void Histogram::Reset() { |
| 13 | Mutex::ScopedLock lock(mutex_); |
| 14 | hdr_reset(histogram_.get()); |
| 15 | exceeds_ = 0; |
| 16 | count_ = 0; |
| 17 | prev_ = 0; |
| 18 | } |
| 19 | |
| 20 | double Histogram::Add(const Histogram& other) { |
| 21 | Mutex::ScopedLock lock(mutex_); |
| 22 | count_ += other.count_; |
| 23 | exceeds_ += other.exceeds_; |
| 24 | if (other.prev_ > prev_) |
| 25 | prev_ = other.prev_; |
| 26 | return static_cast<double>(hdr_add(histogram_.get(), other.histogram_.get())); |
| 27 | } |
| 28 | |
| 29 | size_t Histogram::Count() const { |
| 30 | Mutex::ScopedLock lock(mutex_); |
| 31 | return count_; |
| 32 | } |
| 33 | |
| 34 | int64_t Histogram::Min() const { |
| 35 | Mutex::ScopedLock lock(mutex_); |
| 36 | return hdr_min(histogram_.get()); |
| 37 | } |
| 38 | |
| 39 | int64_t Histogram::Max() const { |
| 40 | Mutex::ScopedLock lock(mutex_); |
| 41 | return hdr_max(histogram_.get()); |
| 42 | } |
| 43 | |
| 44 | double Histogram::Mean() const { |
| 45 | Mutex::ScopedLock lock(mutex_); |
| 46 | return hdr_mean(histogram_.get()); |
| 47 | } |
| 48 | |
| 49 | double Histogram::Stddev() const { |
| 50 | Mutex::ScopedLock lock(mutex_); |
| 51 | return hdr_stddev(histogram_.get()); |
| 52 | } |
| 53 | |
| 54 | int64_t Histogram::Percentile(double percentile) const { |
| 55 | Mutex::ScopedLock lock(mutex_); |
| 56 | CHECK_GT(percentile, 0)do { if (__builtin_expect(!!(!((percentile) > (0))), 0)) { do { static const node::AssertionInfo args = { "../src/histogram-inl.h" ":" "56", "(percentile) > (0)", __PRETTY_FUNCTION__ }; node ::Assert(args); } while (0); } } while (0); |
| 57 | CHECK_LE(percentile, 100)do { if (__builtin_expect(!!(!((percentile) <= (100))), 0) ) { do { static const node::AssertionInfo args = { "../src/histogram-inl.h" ":" "57", "(percentile) <= (100)", __PRETTY_FUNCTION__ }; node::Assert(args); } while (0); } } while (0); |
| 58 | return hdr_value_at_percentile(histogram_.get(), percentile); |
| 59 | } |
| 60 | |
| 61 | template <typename Iterator> |
| 62 | void Histogram::Percentiles(Iterator&& fn) { |
| 63 | Mutex::ScopedLock lock(mutex_); |
| 64 | hdr_iter iter; |
| 65 | hdr_iter_percentile_init(&iter, histogram_.get(), 1); |
| 66 | while (hdr_iter_next(&iter)) { |
| 67 | double key = iter.specifics.percentiles.percentile; |
| 68 | fn(key, iter.value); |
| 69 | } |
| 70 | } |
| 71 | |
| 72 | bool Histogram::Record(int64_t value) { |
| 73 | Mutex::ScopedLock lock(mutex_); |
| 74 | bool recorded = hdr_record_value(histogram_.get(), value); |
| 75 | if (!recorded) |
| 76 | exceeds_++; |
| 77 | else |
| 78 | count_++; |
| 79 | return recorded; |
| 80 | } |
| 81 | |
| 82 | uint64_t Histogram::RecordDelta() { |
| 83 | Mutex::ScopedLock lock(mutex_); |
| 84 | uint64_t time = uv_hrtime(); |
| 85 | int64_t delta = 0; |
| 86 | if (prev_ > 0) { |
| 87 | CHECK_GE(time, prev_)do { if (__builtin_expect(!!(!((time) >= (prev_))), 0)) { do { static const node::AssertionInfo args = { "../src/histogram-inl.h" ":" "87", "(time) >= (prev_)", __PRETTY_FUNCTION__ }; node ::Assert(args); } while (0); } } while (0); |
| 88 | delta = time - prev_; |
| 89 | if (hdr_record_value(histogram_.get(), delta)) |
| 90 | count_++; |
| 91 | else |
| 92 | exceeds_++; |
| 93 | } |
| 94 | prev_ = time; |
| 95 | return delta; |
| 96 | } |
| 97 | |
| 98 | size_t Histogram::GetMemorySize() const { |
| 99 | Mutex::ScopedLock lock(mutex_); |
| 100 | return hdr_get_memory_size(histogram_.get()); |
| 101 | } |
| 102 | |
| 103 | } // namespace node |
| 104 | |
| 105 | #endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS |
| 106 | |
| 107 | #endif // SRC_HISTOGRAM_INL_H_ |