summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/bindings/core/v8/v8_gc_controller.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/blink/renderer/bindings/core/v8/v8_gc_controller.cc')
-rw-r--r--chromium/third_party/blink/renderer/bindings/core/v8/v8_gc_controller.cc35
1 files changed, 18 insertions, 17 deletions
diff --git a/chromium/third_party/blink/renderer/bindings/core/v8/v8_gc_controller.cc b/chromium/third_party/blink/renderer/bindings/core/v8/v8_gc_controller.cc
index d36cb64149c..576f82e2406 100644
--- a/chromium/third_party/blink/renderer/bindings/core/v8/v8_gc_controller.cc
+++ b/chromium/third_party/blink/renderer/bindings/core/v8/v8_gc_controller.cc
@@ -53,6 +53,7 @@
#include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
#include "third_party/blink/renderer/platform/runtime_enabled_features.h"
#include "third_party/blink/renderer/platform/wtf/allocator/partitions.h"
+#include "third_party/blink/renderer/platform/wtf/buildflags.h"
#include "third_party/blink/renderer/platform/wtf/text/string_builder.h"
namespace blink {
@@ -75,23 +76,29 @@ Node* V8GCController::OpaqueRootForGC(v8::Isolate*, Node* node) {
return node;
}
+#if !BUILDFLAG(USE_V8_OILPAN)
namespace {
-
bool IsNestedInV8GC(ThreadState* thread_state, v8::GCType type) {
return thread_state && (type == v8::kGCTypeMarkSweepCompact ||
type == v8::kGCTypeIncrementalMarking);
}
-
} // namespace
+#endif // !USE_V8_OILPAN
void V8GCController::GcPrologue(v8::Isolate* isolate,
v8::GCType type,
v8::GCCallbackFlags flags) {
RUNTIME_CALL_TIMER_SCOPE(isolate, RuntimeCallStats::CounterId::kGcPrologue);
+#if !BUILDFLAG(USE_V8_OILPAN)
ThreadHeapStatsCollector::BlinkGCInV8Scope nested_scope(
IsNestedInV8GC(ThreadState::Current(), type)
? ThreadState::Current()->Heap().stats_collector()
: nullptr);
+#endif // !USE_V8_OILPAN
+
+ auto* per_isolate_data = V8PerIsolateData::From(isolate);
+ per_isolate_data->EnterGC();
+
ScriptForbiddenScope::Enter();
// Attribute garbage collection to the all frames instead of a specific
@@ -105,14 +112,12 @@ void V8GCController::GcPrologue(v8::Isolate* isolate,
case v8::kGCTypeIncrementalMarking:
// Recomputing ASWs is opportunistic during incremental marking as they
// only need to be recomputing during the atomic pause for corectness.
- V8PerIsolateData::From(isolate)
- ->GetActiveScriptWrappableManager()
+ per_isolate_data->GetActiveScriptWrappableManager()
->RecomputeActiveScriptWrappables(
ActiveScriptWrappableManager::RecomputeMode::kOpportunistic);
break;
case v8::kGCTypeMarkSweepCompact:
- V8PerIsolateData::From(isolate)
- ->GetActiveScriptWrappableManager()
+ per_isolate_data->GetActiveScriptWrappableManager()
->RecomputeActiveScriptWrappables(
ActiveScriptWrappableManager::RecomputeMode::kRequired);
break;
@@ -125,10 +130,15 @@ void V8GCController::GcEpilogue(v8::Isolate* isolate,
v8::GCType type,
v8::GCCallbackFlags flags) {
RUNTIME_CALL_TIMER_SCOPE(isolate, RuntimeCallStats::CounterId::kGcEpilogue);
+#if !BUILDFLAG(USE_V8_OILPAN)
ThreadHeapStatsCollector::BlinkGCInV8Scope nested_scope(
IsNestedInV8GC(ThreadState::Current(), type)
? ThreadState::Current()->Heap().stats_collector()
: nullptr);
+#endif // !USE_V8_OILPAN
+
+ V8PerIsolateData::From(isolate)->LeaveGC();
+
ScriptForbiddenScope::Exit();
if (BlameContext* blame_context =
@@ -136,17 +146,8 @@ void V8GCController::GcEpilogue(v8::Isolate* isolate,
blame_context->Leave();
ThreadState* current_thread_state = ThreadState::Current();
- if (current_thread_state && !current_thread_state->IsGCForbidden()) {
- if (flags & v8::kGCCallbackFlagForced) {
- // Forces a precise GC at the end of the current event loop. This is
- // required for testing code that cannot use GC internals but rather has
- // to rely on window.gc(). Only schedule additional GCs if the last GC was
- // using conservative stack scanning.
- if (type == v8::kGCTypeScavenge ||
- current_thread_state->RequiresForcedGCForTesting()) {
- current_thread_state->ScheduleForcedGCForTesting();
- }
- }
+ if (current_thread_state) {
+ current_thread_state->NotifyGarbageCollection(type, flags);
}
TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"),