diff options
author | Kirill Fomichev <fanatid@ya.ru> | 2019-09-04 23:54:01 +0300 |
---|---|---|
committer | Rich Trott <rtrott@gmail.com> | 2019-09-07 07:03:04 -0700 |
commit | 6d01f1fa41947dc2ea087611ed443616b757fef8 (patch) | |
tree | a3d78bc808caa373f9bbb1acc851f6473dff8f53 /src/node_perf.cc | |
parent | bbcbce60718353705460cdc6d8b06df4e2288c08 (diff) | |
download | android-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.cc | 30 |
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); |