summaryrefslogtreecommitdiff
path: root/src/node_perf.cc
diff options
context:
space:
mode:
authorAnna Henningsen <anna@addaleax.net>2018-12-14 22:55:03 +0100
committerAnna Henningsen <anna@addaleax.net>2018-12-17 02:29:10 +0100
commit8dfd7573372ba49f87f0838191b83ea4c8bd509a (patch)
treeea14ad03b6fb40c1c260a895879fc49f62d97604 /src/node_perf.cc
parentcc0e1770d950fbdfb73d8640ba5468cdc06534bd (diff)
downloadandroid-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.cc18
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));
}