summaryrefslogtreecommitdiff
path: root/src/node_perf.cc
diff options
context:
space:
mode:
authorKirill Fomichev <fanatid@ya.ru>2019-09-04 23:54:01 +0300
committerRich Trott <rtrott@gmail.com>2019-09-07 07:03:04 -0700
commit6d01f1fa41947dc2ea087611ed443616b757fef8 (patch)
treea3d78bc808caa373f9bbb1acc851f6473dff8f53 /src/node_perf.cc
parentbbcbce60718353705460cdc6d8b06df4e2288c08 (diff)
downloadandroid-node-v8-6d01f1fa41947dc2ea087611ed443616b757fef8.tar.gz
android-node-v8-6d01f1fa41947dc2ea087611ed443616b757fef8.tar.bz2
android-node-v8-6d01f1fa41947dc2ea087611ed443616b757fef8.zip
perf_hooks: remove GC callbacks on zero observers count
When all existed PerformanceObserver instances removed for type `gc` GC callbacks should be removed. PR-URL: https://github.com/nodejs/node/pull/29444 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Minwoo Jung <minwoo@nodesource.com>
Diffstat (limited to 'src/node_perf.cc')
-rw-r--r--src/node_perf.cc30
1 files changed, 22 insertions, 8 deletions
diff --git a/src/node_perf.cc b/src/node_perf.cc
index 3efaca6065..da711fee84 100644
--- a/src/node_perf.cc
+++ b/src/node_perf.cc
@@ -277,7 +277,13 @@ void MarkGarbageCollectionEnd(Isolate* isolate,
});
}
-static void SetupGarbageCollectionTracking(
+void GarbageCollectionCleanupHook(void* data) {
+ Environment* env = static_cast<Environment*>(data);
+ env->isolate()->RemoveGCPrologueCallback(MarkGarbageCollectionStart, data);
+ env->isolate()->RemoveGCEpilogueCallback(MarkGarbageCollectionEnd, data);
+}
+
+static void InstallGarbageCollectionTracking(
const FunctionCallbackInfo<Value>& args) {
Environment* env = Environment::GetCurrent(args);
@@ -285,11 +291,15 @@ static void SetupGarbageCollectionTracking(
static_cast<void*>(env));
env->isolate()->AddGCEpilogueCallback(MarkGarbageCollectionEnd,
static_cast<void*>(env));
- env->AddCleanupHook([](void* data) {
- Environment* env = static_cast<Environment*>(data);
- env->isolate()->RemoveGCPrologueCallback(MarkGarbageCollectionStart, data);
- env->isolate()->RemoveGCEpilogueCallback(MarkGarbageCollectionEnd, data);
- }, env);
+ env->AddCleanupHook(GarbageCollectionCleanupHook, env);
+}
+
+static void RemoveGarbageCollectionTracking(
+ const FunctionCallbackInfo<Value> &args) {
+ Environment* env = Environment::GetCurrent(args);
+
+ env->RemoveCleanupHook(GarbageCollectionCleanupHook, env);
+ GarbageCollectionCleanupHook(env);
}
// Gets the name of a function
@@ -575,8 +585,12 @@ void Initialize(Local<Object> target,
env->SetMethod(target, "markMilestone", MarkMilestone);
env->SetMethod(target, "setupObservers", SetupPerformanceObservers);
env->SetMethod(target, "timerify", Timerify);
- env->SetMethod(
- target, "setupGarbageCollectionTracking", SetupGarbageCollectionTracking);
+ env->SetMethod(target,
+ "installGarbageCollectionTracking",
+ InstallGarbageCollectionTracking);
+ env->SetMethod(target,
+ "removeGarbageCollectionTracking",
+ RemoveGarbageCollectionTracking);
env->SetMethod(target, "notify", Notify);
Local<Object> constants = Object::New(isolate);