@@ -277,19 +277,29 @@ void MarkGarbageCollectionEnd(Isolate* isolate,
277277 });
278278}
279279
280- static void SetupGarbageCollectionTracking (
280+ void GarbageCollectionCleanupHook (void * data) {
281+ Environment* env = static_cast <Environment*>(data);
282+ env->isolate ()->RemoveGCPrologueCallback (MarkGarbageCollectionStart, data);
283+ env->isolate ()->RemoveGCEpilogueCallback (MarkGarbageCollectionEnd, data);
284+ }
285+
286+ static void InstallGarbageCollectionTracking (
281287 const FunctionCallbackInfo<Value>& args) {
282288 Environment* env = Environment::GetCurrent (args);
283289
284290 env->isolate ()->AddGCPrologueCallback (MarkGarbageCollectionStart,
285291 static_cast <void *>(env));
286292 env->isolate ()->AddGCEpilogueCallback (MarkGarbageCollectionEnd,
287293 static_cast <void *>(env));
288- env->AddCleanupHook ([](void * data) {
289- Environment* env = static_cast <Environment*>(data);
290- env->isolate ()->RemoveGCPrologueCallback (MarkGarbageCollectionStart, data);
291- env->isolate ()->RemoveGCEpilogueCallback (MarkGarbageCollectionEnd, data);
292- }, env);
294+ env->AddCleanupHook (GarbageCollectionCleanupHook, env);
295+ }
296+
297+ static void RemoveGarbageCollectionTracking (
298+ const FunctionCallbackInfo<Value> &args) {
299+ Environment* env = Environment::GetCurrent (args);
300+
301+ env->RemoveCleanupHook (GarbageCollectionCleanupHook, env);
302+ GarbageCollectionCleanupHook (env);
293303}
294304
295305// Gets the name of a function
@@ -575,8 +585,12 @@ void Initialize(Local<Object> target,
575585 env->SetMethod (target, " markMilestone" , MarkMilestone);
576586 env->SetMethod (target, " setupObservers" , SetupPerformanceObservers);
577587 env->SetMethod (target, " timerify" , Timerify);
578- env->SetMethod (
579- target, " setupGarbageCollectionTracking" , SetupGarbageCollectionTracking);
588+ env->SetMethod (target,
589+ " installGarbageCollectionTracking" ,
590+ InstallGarbageCollectionTracking);
591+ env->SetMethod (target,
592+ " removeGarbageCollectionTracking" ,
593+ RemoveGarbageCollectionTracking);
580594 env->SetMethod (target, " notify" , Notify);
581595
582596 Local<Object> constants = Object::New (isolate);
0 commit comments