v8/test/cctest/heap/test-write-barrier.cc
Ulan Degenbaev 6ed4495374 [heap] Consolidate marking write barrier logic in MarkingBarrier
This moves marking write barrier related functions from Heap and
IncrementalMarking into a separate class: MarkingBarrier.

Additionally, a new WriteBarrier class is added at the heap API level
that dispatches to MarkingBarrier.

Future CLs will move slots recording in MarkingBarrier and apply
the same refactoring to the generational barrier. An instance of
MarkingBarrier will be added to each LocalHeap and enable it to
emit a write barrier from a background thread.

Bug: v8:10315
Change-Id: Icc147b48563d88c85d99ead99b1e201f523721d0
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2280083
Reviewed-by: Dominik Inführ <dinfuehr@chromium.org>
Reviewed-by: Jakob Gruber <jgruber@chromium.org>
Commit-Queue: Ulan Degenbaev <ulan@chromium.org>
Cr-Commit-Position: refs/heads/master@{#68703}
2020-07-07 10:34:37 +00:00

86 lines
3.3 KiB
C++

// Copyright 2015 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "src/heap/incremental-marking.h"
#include "src/heap/mark-compact.h"
#include "src/heap/spaces.h"
#include "src/objects/objects-inl.h"
#include "test/cctest/cctest.h"
#include "test/cctest/heap/heap-tester.h"
#include "test/cctest/heap/heap-utils.h"
namespace v8 {
namespace internal {
namespace heap {
HEAP_TEST(WriteBarrier_Marking) {
ManualGCScope manual_gc_scope;
CcTest::InitializeVM();
Isolate* isolate = CcTest::i_isolate();
Factory* factory = isolate->factory();
MarkCompactCollector* collector = isolate->heap()->mark_compact_collector();
HandleScope outer(isolate);
Handle<FixedArray> objects = factory->NewFixedArray(3);
{
// Make sure that these objects are not immediately reachable from
// the roots to prevent them being marked grey at the start of marking.
HandleScope inner(isolate);
Handle<FixedArray> host = factory->NewFixedArray(1);
Handle<HeapNumber> value1 = factory->NewHeapNumber(1.1);
Handle<HeapNumber> value2 = factory->NewHeapNumber(1.2);
objects->set(0, *host);
objects->set(1, *value1);
objects->set(2, *value2);
}
heap::SimulateIncrementalMarking(CcTest::heap(), false);
FixedArray host = FixedArray::cast(objects->get(0));
HeapObject value1 = HeapObject::cast(objects->get(1));
HeapObject value2 = HeapObject::cast(objects->get(2));
CHECK(collector->marking_state()->IsWhite(host));
CHECK(collector->marking_state()->IsWhite(value1));
WriteBarrier::Marking(host, host.RawFieldOfElementAt(0), value1);
CHECK_EQ(V8_CONCURRENT_MARKING_BOOL,
collector->marking_state()->IsGrey(value1));
collector->marking_state()->WhiteToGrey(host);
collector->marking_state()->GreyToBlack(host);
CHECK(collector->marking_state()->IsWhite(value2));
WriteBarrier::Marking(host, host.RawFieldOfElementAt(0), value2);
CHECK(collector->marking_state()->IsGrey(value2));
heap::SimulateIncrementalMarking(CcTest::heap(), true);
CHECK(collector->marking_state()->IsBlack(host));
CHECK(collector->marking_state()->IsBlack(value1));
CHECK(collector->marking_state()->IsBlack(value2));
}
HEAP_TEST(WriteBarrier_MarkingExtension) {
ManualGCScope manual_gc_scope;
CcTest::InitializeVM();
Isolate* isolate = CcTest::i_isolate();
Factory* factory = isolate->factory();
MarkCompactCollector* collector = isolate->heap()->mark_compact_collector();
HandleScope outer(isolate);
Handle<FixedArray> objects = factory->NewFixedArray(1);
ArrayBufferExtension* extension;
{
HandleScope inner(isolate);
Local<v8::ArrayBuffer> ab = v8::ArrayBuffer::New(CcTest::isolate(), 100);
Handle<JSArrayBuffer> host = v8::Utils::OpenHandle(*ab);
extension = host->extension();
objects->set(0, *host);
}
heap::SimulateIncrementalMarking(CcTest::heap(), false);
JSArrayBuffer host = JSArrayBuffer::cast(objects->get(0));
CHECK(collector->marking_state()->IsWhite(host));
CHECK(!extension->IsMarked());
WriteBarrier::Marking(host, extension);
CHECK_EQ(V8_CONCURRENT_MARKING_BOOL, extension->IsMarked());
heap::SimulateIncrementalMarking(CcTest::heap(), true);
CHECK(collector->marking_state()->IsBlack(host));
CHECK(extension->IsMarked());
}
} // namespace heap
} // namespace internal
} // namespace v8