diff options
author | Anna Henningsen <anna@addaleax.net> | 2018-12-14 22:55:03 +0100 |
---|---|---|
committer | Anna Henningsen <anna@addaleax.net> | 2018-12-17 02:29:10 +0100 |
commit | 8dfd7573372ba49f87f0838191b83ea4c8bd509a (patch) | |
tree | ea14ad03b6fb40c1c260a895879fc49f62d97604 /src/node_perf.cc | |
parent | cc0e1770d950fbdfb73d8640ba5468cdc06534bd (diff) | |
download | android-node-v8-8dfd7573372ba49f87f0838191b83ea4c8bd509a.tar.gz android-node-v8-8dfd7573372ba49f87f0838191b83ea4c8bd509a.tar.bz2 android-node-v8-8dfd7573372ba49f87f0838191b83ea4c8bd509a.zip |
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.
PR-URL: https://github.com/nodejs/node/pull/25053
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Diffstat (limited to 'src/node_perf.cc')
-rw-r--r-- | src/node_perf.cc | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/src/node_perf.cc b/src/node_perf.cc index 2b7faccec9..45d66ad591 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<Environment*>(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<Environment*>(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<PerformanceGCKind>(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<void*>(env)); env->isolate()->AddGCEpilogueCallback(MarkGarbageCollectionEnd, static_cast<void*>(env)); } |