From f1511e4775fb7f2db05d38207af9df1da2043bdd Mon Sep 17 00:00:00 2001 From: Anna Henningsen Date: Fri, 14 Dec 2018 22:55:03 +0100 Subject: [PATCH] perf_hooks: make GC tracking state per-Environment Otherwise this is global state that may be subject to race conditions e.g. when running `perf_hooks` inside of Worker threads. Tracking the GC type is removed entirely since the variable was unused. --- src/node_perf.cc | 18 +++++++++--------- src/node_perf_common.h | 2 ++ 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/node_perf.cc b/src/node_perf.cc index 2b7faccec9a71b..45d66ad5917ab2 100644 --- a/src/node_perf.cc +++ b/src/node_perf.cc @@ -42,9 +42,6 @@ const double timeOriginTimestamp = GetCurrentTimeInMicroseconds(); uint64_t performance_node_start; uint64_t performance_v8_start; -uint64_t performance_last_gc_start_mark_ = 0; -GCType performance_last_gc_type_ = GCType::kGCTypeAll; - void performance_state::Mark(enum PerformanceMilestone milestone, uint64_t ts) { this->milestones[milestone] = ts; @@ -268,9 +265,10 @@ void PerformanceGCCallback(Environment* env, void* ptr) { // Marks the start of a GC cycle void MarkGarbageCollectionStart(Isolate* isolate, GCType type, - GCCallbackFlags flags) { - performance_last_gc_start_mark_ = PERFORMANCE_NOW(); - performance_last_gc_type_ = type; + GCCallbackFlags flags, + void* data) { + Environment* env = static_cast(data); + env->performance_state()->performance_last_gc_start_mark = PERFORMANCE_NOW(); } // Marks the end of a GC cycle @@ -279,13 +277,14 @@ void MarkGarbageCollectionEnd(Isolate* isolate, GCCallbackFlags flags, void* data) { Environment* env = static_cast(data); + performance_state* state = env->performance_state(); // If no one is listening to gc performance entries, do not create them. - if (!env->performance_state()->observers[NODE_PERFORMANCE_ENTRY_TYPE_GC]) + if (!state->observers[NODE_PERFORMANCE_ENTRY_TYPE_GC]) return; GCPerformanceEntry* entry = new GCPerformanceEntry(env, static_cast(type), - performance_last_gc_start_mark_, + state->performance_last_gc_start_mark, PERFORMANCE_NOW()); env->SetUnrefImmediate(PerformanceGCCallback, entry); @@ -293,7 +292,8 @@ void MarkGarbageCollectionEnd(Isolate* isolate, inline void SetupGarbageCollectionTracking(Environment* env) { - env->isolate()->AddGCPrologueCallback(MarkGarbageCollectionStart); + env->isolate()->AddGCPrologueCallback(MarkGarbageCollectionStart, + static_cast(env)); env->isolate()->AddGCEpilogueCallback(MarkGarbageCollectionEnd, static_cast(env)); } diff --git a/src/node_perf_common.h b/src/node_perf_common.h index 3c7e51361e6eae..0053ebf6119744 100644 --- a/src/node_perf_common.h +++ b/src/node_perf_common.h @@ -75,6 +75,8 @@ class performance_state { AliasedBuffer milestones; AliasedBuffer observers; + uint64_t performance_last_gc_start_mark = 0; + void Mark(enum PerformanceMilestone milestone, uint64_t ts = PERFORMANCE_NOW());