Skip to content

Commit 3f20e89

Browse files
committed
perf_hooks: deduplicate histogram Start/Stop via shared templates
Added shared templates for duplicated start/stop logic in IntevalHistogram and IterationHistogram.
1 parent 2583bbf commit 3f20e89

4 files changed

Lines changed: 49 additions & 31 deletions

File tree

src/env_properties.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -434,7 +434,7 @@
434434
V(http2ping_constructor_template, v8::ObjectTemplate) \
435435
V(i18n_converter_template, v8::ObjectTemplate) \
436436
V(intervalhistogram_constructor_template, v8::FunctionTemplate) \
437-
V(iterationhistogram_constructor_template, v8::FunctionTemplate) \
437+
V(iterationhistogram_constructor_template, v8::FunctionTemplate) \
438438
V(iter_template, v8::DictionaryTemplate) \
439439
V(js_transferable_constructor_template, v8::FunctionTemplate) \
440440
V(libuv_stream_wrap_ctor_template, v8::FunctionTemplate) \

src/histogram.cc

Lines changed: 28 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,20 @@ using v8::String;
2525
using v8::Uint32;
2626
using v8::Value;
2727

28+
template <typename T>
29+
void StartHandleHistogram(Local<Value> receiver, bool reset) {
30+
T* histogram;
31+
ASSIGN_OR_RETURN_UNWRAP(&histogram, receiver);
32+
histogram->OnStart(reset ? T::StartFlags::RESET : T::StartFlags::NONE);
33+
}
34+
35+
template <typename T>
36+
void StopHandleHistogram(Local<Value> receiver) {
37+
T* histogram;
38+
ASSIGN_OR_RETURN_UNWRAP(&histogram, receiver);
39+
histogram->OnStop();
40+
}
41+
2842
Histogram::Histogram(const Options& options) {
2943
hdr_histogram* histogram;
3044
CHECK_EQ(0, hdr_init(options.lowest,
@@ -423,32 +437,25 @@ void IntervalHistogram::OnStop() {
423437
}
424438

425439
void IntervalHistogram::Start(const FunctionCallbackInfo<Value>& args) {
426-
IntervalHistogram* histogram;
427-
ASSIGN_OR_RETURN_UNWRAP(&histogram, args.This());
428-
histogram->OnStart(args[0]->IsTrue() ? StartFlags::RESET : StartFlags::NONE);
440+
StartHandleHistogram<IntervalHistogram>(args.This(), args[0]->IsTrue());
429441
}
430442

431443
void IntervalHistogram::FastStart(Local<Value> receiver, bool reset) {
432444
TRACK_V8_FAST_API_CALL("histogram.start");
433-
IntervalHistogram* histogram;
434-
ASSIGN_OR_RETURN_UNWRAP(&histogram, receiver);
435-
histogram->OnStart(reset ? StartFlags::RESET : StartFlags::NONE);
445+
StartHandleHistogram<IntervalHistogram>(receiver, reset);
436446
}
437447

438448
void IntervalHistogram::Stop(const FunctionCallbackInfo<Value>& args) {
439-
IntervalHistogram* histogram;
440-
ASSIGN_OR_RETURN_UNWRAP(&histogram, args.This());
441-
histogram->OnStop();
449+
StopHandleHistogram<IntervalHistogram>(args.This());
442450
}
443451

444452
void IntervalHistogram::FastStop(Local<Value> receiver) {
445453
TRACK_V8_FAST_API_CALL("histogram.stop");
446-
IntervalHistogram* histogram;
447-
ASSIGN_OR_RETURN_UNWRAP(&histogram, receiver);
448-
histogram->OnStop();
454+
StopHandleHistogram<IntervalHistogram>(receiver);
449455
}
450456

451-
Local<FunctionTemplate> IterationHistogram::GetConstructorTemplate(Environment* env) {
457+
Local<FunctionTemplate> IterationHistogram::GetConstructorTemplate(
458+
Environment* env) {
452459
Local<FunctionTemplate> tmpl = env->iterationhistogram_constructor_template();
453460
if (tmpl.IsEmpty()) {
454461
Isolate* isolate = env->isolate();
@@ -515,7 +522,8 @@ void IterationHistogram::PrepareCB(uv_prepare_t* handle) {
515522
}
516523

517524
void IterationHistogram::CheckCB(uv_check_t* handle) {
518-
IterationHistogram* self = ContainerOf(&IterationHistogram::check_handle_, handle);
525+
IterationHistogram* self =
526+
ContainerOf(&IterationHistogram::check_handle_, handle);
519527
if (!self->enabled_) return;
520528

521529
uint64_t check_time = uv_hrtime();
@@ -565,29 +573,21 @@ void IterationHistogram::Close(Local<Value> close_callback) {
565573
}
566574

567575
void IterationHistogram::Start(const FunctionCallbackInfo<Value>& args) {
568-
IterationHistogram* histogram;
569-
ASSIGN_OR_RETURN_UNWRAP(&histogram, args.This());
570-
histogram->OnStart(args[0]->IsTrue() ? StartFlags::RESET : StartFlags::NONE);
576+
StartHandleHistogram<IterationHistogram>(args.This(), args[0]->IsTrue());
571577
}
572578

573579
void IterationHistogram::FastStart(Local<Value> receiver, bool reset) {
574580
TRACK_V8_FAST_API_CALL("histogram.eventLoopDelay.start");
575-
IterationHistogram* histogram;
576-
ASSIGN_OR_RETURN_UNWRAP(&histogram, receiver);
577-
histogram->OnStart(reset ? StartFlags::RESET : StartFlags::NONE);
581+
StartHandleHistogram<IterationHistogram>(receiver, reset);
578582
}
579583

580584
void IterationHistogram::Stop(const FunctionCallbackInfo<Value>& args) {
581-
IterationHistogram* histogram;
582-
ASSIGN_OR_RETURN_UNWRAP(&histogram, args.This());
583-
histogram->OnStop();
585+
StopHandleHistogram<IterationHistogram>(args.This());
584586
}
585587

586588
void IterationHistogram::FastStop(Local<Value> receiver) {
587589
TRACK_V8_FAST_API_CALL("histogram.eventLoopDelay.stop");
588-
IterationHistogram* histogram;
589-
ASSIGN_OR_RETURN_UNWRAP(&histogram, receiver);
590-
histogram->OnStop();
590+
StopHandleHistogram<IterationHistogram>(receiver);
591591
}
592592

593593
void HistogramImpl::GetCount(const FunctionCallbackInfo<Value>& args) {
@@ -753,7 +753,8 @@ HistogramImpl* HistogramImpl::FromJSObject(Local<Value> value) {
753753
HistogramImpl::kImplField, EmbedderDataTag::kDefault));
754754
}
755755

756-
std::unique_ptr<worker::TransferData> IterationHistogram::CloneForMessaging() const {
756+
std::unique_ptr<worker::TransferData> IterationHistogram::CloneForMessaging()
757+
const {
757758
return std::make_unique<HistogramBase::HistogramTransferData>(histogram());
758759
}
759760

src/histogram.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,11 @@ namespace node {
2020

2121
class ExternalReferenceRegistry;
2222

23+
template <typename T>
24+
void StartHandleHistogram(v8::Local<v8::Value> receiver, bool reset);
25+
template <typename T>
26+
void StopHandleHistogram(v8::Local<v8::Value> receiver);
27+
2328
constexpr int kDefaultHistogramFigures = 3;
2429

2530
class Histogram : public MemoryRetainer {
@@ -257,6 +262,11 @@ class IntervalHistogram final : public HandleWrap, public HistogramImpl {
257262
void OnStart(StartFlags flags = StartFlags::RESET);
258263
void OnStop();
259264

265+
template <typename T>
266+
friend void StartHandleHistogram(v8::Local<v8::Value>, bool);
267+
template <typename T>
268+
friend void StopHandleHistogram(v8::Local<v8::Value>);
269+
260270
bool enabled_ = false;
261271
int32_t interval_ = 0;
262272
std::function<void(Histogram&)> on_interval_;
@@ -312,6 +322,11 @@ class IterationHistogram final : public HandleWrap, public HistogramImpl {
312322
void OnStart(StartFlags flags = StartFlags::RESET);
313323
void OnStop();
314324

325+
template <typename T>
326+
friend void StartHandleHistogram(v8::Local<v8::Value>, bool);
327+
template <typename T>
328+
friend void StopHandleHistogram(v8::Local<v8::Value>);
329+
315330
bool enabled_ = false;
316331
uv_prepare_t prepare_handle_;
317332
uv_check_t check_handle_;

src/node_task_queue.cc

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,11 @@ void PromiseRejectCallback(PromiseRejectMessage message) {
7676
value = Undefined(isolate);
7777
rejectionsHandledAfter++;
7878
TRACE_COUNTER2(TRACING_CATEGORY_NODE2(promises, rejections),
79-
"rejections",
80-
"unhandled", unhandledRejections,
81-
"handledAfter", rejectionsHandledAfter);
79+
"rejections",
80+
"unhandled",
81+
unhandledRejections,
82+
"handledAfter",
83+
rejectionsHandledAfter);
8284
} else {
8385
return;
8486
}

0 commit comments

Comments
 (0)