void Isolate::CollectAllGarbage(const char* gc_reason) {
i::Heap* heap = reinterpret_cast<i::Isolate*>(this)->heap();
if (heap->incremental_marking()->IsStopped()) {
- heap->StartIncrementalMarking(i::Heap::kNoGCFlags, kGCCallbackFlagForced,
- gc_reason);
- }
- // TODO(mlippautz): Compute the time slice for incremental marking based on
- // memory pressure.
- double deadline = heap->MonotonicallyIncreasingTimeInMs() +
- i::FLAG_external_allocation_limit_incremental_time;
- heap->AdvanceIncrementalMarking(0, deadline,
- i::IncrementalMarking::StepActions(
- i::IncrementalMarking::GC_VIA_STACK_GUARD,
- i::IncrementalMarking::FORCE_MARKING,
- i::IncrementalMarking::FORCE_COMPLETION));
+ if (heap->incremental_marking()->CanBeActivated()) {
+ heap->StartIncrementalMarking(i::Heap::kNoGCFlags, kGCCallbackFlagForced,
+ gc_reason);
+ } else {
+ heap->CollectAllGarbage(i::Heap::kNoGCFlags, gc_reason,
+ kGCCallbackFlagForced);
+ }
+ } else {
+ // Incremental marking is turned on an has already been started.
+
+ // TODO(mlippautz): Compute the time slice for incremental marking based on
+ // memory pressure.
+ double deadline = heap->MonotonicallyIncreasingTimeInMs() +
+ i::FLAG_external_allocation_limit_incremental_time;
+ heap->AdvanceIncrementalMarking(
+ 0, deadline, i::IncrementalMarking::StepActions(
+ i::IncrementalMarking::GC_VIA_STACK_GUARD,
+ i::IncrementalMarking::FORCE_MARKING,
+ i::IncrementalMarking::FORCE_COMPLETION));
+ }
}
}
+TEST(Regress51719) {
+ i::FLAG_incremental_marking = false;
+ CcTest::InitializeVM();
+
+ const int64_t kTriggerGCSize =
+ v8::internal::Internals::kExternalAllocationLimit + 1;
+ v8::Isolate* isolate = CcTest::isolate();
+ isolate->AdjustAmountOfExternalAllocatedMemory(kTriggerGCSize);
+}
+
+
// Regression test for issue 54, object templates with internal fields
// but no accessors or interceptors did not get their internal field
// count set on instances.