v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
finalization-registry-cleanup-task.cc
Go to the documentation of this file.
1// Copyright 2020 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
6
11#include "src/heap/heap-inl.h"
14
15namespace v8 {
16namespace internal {
17
20
22#ifdef ENABLE_SLOW_DCHECKS
23 class NoActiveJavaScript : public ThreadVisitor {
24 public:
25 void VisitThread(Isolate* isolate, ThreadLocalTop* top) override {
26 for (StackFrameIterator it(isolate, top); !it.done(); it.Advance()) {
27 DCHECK(!it.frame()->is_javascript());
28 }
29 }
30 };
31 NoActiveJavaScript no_active_js_visitor;
32 Isolate* isolate = heap_->isolate();
33 no_active_js_visitor.VisitThread(isolate, isolate->thread_local_top());
34 isolate->thread_manager()->IterateArchivedThreads(&no_active_js_visitor);
35#endif // ENABLE_SLOW_DCHECKS
36}
37
39 Isolate* isolate = heap_->isolate();
41
43 "V8.FinalizationRegistryCleanupTask");
44
45 HandleScope handle_scope(isolate);
46 DirectHandle<JSFinalizationRegistry> finalization_registry;
47 // There could be no dirty FinalizationRegistries. When a context is disposed
48 // by the embedder, its FinalizationRegistries are removed from the dirty
49 // list.
51 &finalization_registry)) {
52 return;
53 }
54 finalization_registry->set_scheduled_for_cleanup(false);
55
56 // Since FinalizationRegistry cleanup callbacks are scheduled by V8, enter the
57 // FinalizationRegistry's context.
59 finalization_registry->native_context(), isolate);
60 v8::Context::Scope context_scope(v8::Utils::ToLocal(native_context));
61 v8::Isolate* v8_isolate = reinterpret_cast<v8::Isolate*>(isolate);
62 v8::TryCatch catcher(v8_isolate);
63 catcher.SetVerbose(true);
64 std::unique_ptr<MicrotasksScope> microtasks_scope;
66 finalization_registry->native_context()->microtask_queue();
67 if (!microtask_queue) microtask_queue = isolate->default_microtask_queue();
68 if (microtask_queue &&
69 microtask_queue->microtasks_policy() == v8::MicrotasksPolicy::kScoped) {
70 // InvokeFinalizationRegistryCleanupFromTask will call into V8 API methods,
71 // so we need a valid microtasks scope on the stack to avoid running into
72 // the CallDepthScope check.
73 microtasks_scope.reset(new v8::MicrotasksScope(
75 }
76
77 // Exceptions are reported via the message handler. This is ensured by the
78 // verbose TryCatch.
79 //
80 // Cleanup is interrupted if there is an exception. The HTML spec calls for a
81 // microtask checkpoint after each cleanup task, so the task should return
82 // after an exception so the host can perform a microtask checkpoint. In case
83 // of exception, check if the FinalizationRegistry still needs cleanup
84 // and should be requeued.
85 //
86 // TODO(syg): Implement better scheduling for finalizers.
88 finalization_registry);
89 if (finalization_registry->NeedsCleanup() &&
90 !finalization_registry->scheduled_for_cleanup()) {
92 heap_->EnqueueDirtyJSFinalizationRegistry(*finalization_registry, nop);
93 }
94
95 // Repost if there are remaining dirty FinalizationRegistries.
98}
99
100} // namespace internal
101} // namespace v8
void SetVerbose(bool value)
Definition api.cc:2856
void EnqueueDirtyJSFinalizationRegistry(Tagged< JSFinalizationRegistry > finalization_registry, std::function< void(Tagged< HeapObject > object, ObjectSlot slot, Tagged< Object > target)> gc_notify_updated_slot)
Definition heap.cc:6851
void PostFinalizationRegistryCleanupTaskIfNeeded()
Definition heap.cc:6840
void set_is_finalization_registry_cleanup_task_posted(bool posted)
Definition heap.h:901
MaybeDirectHandle< JSFinalizationRegistry > DequeueDirtyJSFinalizationRegistry()
Definition heap.cc:6881
Isolate * isolate() const
Definition heap-inl.h:61
MicrotaskQueue * microtask_queue
Definition execution.cc:77
Isolate * isolate
void InvokeFinalizationRegistryCleanupFromTask(DirectHandle< NativeContext > native_context, DirectHandle< JSFinalizationRegistry > finalization_registry)
Definition api.cc:12192
SlotTraits::TObjectSlot ObjectSlot
Definition globals.h:1243
!IsContextMap !IsContextMap native_context
Definition map-inl.h:877
#define DCHECK(condition)
Definition logging.h:482
Heap * heap_
#define TRACE_EVENT_CALL_STATS_SCOPED(isolate, category_group, name)