Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(24)

Side by Side Diff: test/cctest/heap/test-array-buffer-tracker.cc

Issue 1964023002: [heap] Fine-grained JSArrayBuffer tracking (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Tests once more Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 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
5 #include "src/heap/array-buffer-tracker.h"
6 #include "test/cctest/cctest.h"
7 #include "test/cctest/heap/utils-inl.h"
8
9 namespace {
10
11 typedef i::LocalArrayBufferTracker LocalTracker;
12
13 void VerifyTrackedInNewSpace(i::JSArrayBuffer* buf) {
14 CHECK(i::Page::FromAddress(buf->address())->InNewSpace());
15 CHECK(i::Page::FromAddress(buf->address())
16 ->local_tracker()
17 ->IsTrackedForTesting(buf));
18 }
19
20 void VerifyTrackedInOldSpace(i::JSArrayBuffer* buf) {
21 CHECK(!i::Page::FromAddress(buf->address())->InNewSpace());
22 CHECK(i::Page::FromAddress(buf->address())
23 ->local_tracker()
24 ->IsTrackedForTesting(buf));
25 }
26
27 void VerifyUntracked(i::JSArrayBuffer* buf) {
28 CHECK(!i::Page::FromAddress(buf->address())
29 ->local_tracker()
30 ->IsTrackedForTesting(buf));
31 }
32
33 } // namespace
34
35 namespace v8 {
36 namespace internal {
37
38 // The following tests make sure that JSArrayBuffer tracking works expected when
39 // moving the objects through various spaces during GC phases.
40
41 TEST(ArrayBuffer_OnlyMC) {
42 CcTest::InitializeVM();
43 LocalContext env;
44 v8::Isolate* isolate = env->GetIsolate();
45 Heap* heap = reinterpret_cast<Isolate*>(isolate)->heap();
46
47 JSArrayBuffer* raw_ab = nullptr;
48 {
49 v8::HandleScope handle_scope(isolate);
50 Local<v8::ArrayBuffer> ab = v8::ArrayBuffer::New(isolate, 100);
51 Handle<JSArrayBuffer> buf = v8::Utils::OpenHandle(*ab);
52 VerifyTrackedInNewSpace(*buf);
53 GcAndSweep(heap, OLD_SPACE);
54 VerifyTrackedInNewSpace(*buf);
55 GcAndSweep(heap, OLD_SPACE);
56 VerifyTrackedInOldSpace(*buf);
57 raw_ab = *buf;
58 }
59 // 2 GCs are needed because we promote to old space as live, meaining that
60 // we will survive one GC.
61 GcAndSweep(heap, OLD_SPACE);
62 GcAndSweep(heap, OLD_SPACE);
63 VerifyUntracked(raw_ab);
64 }
65
66 TEST(ArrayBuffer_OnlyScavenge) {
67 CcTest::InitializeVM();
68 LocalContext env;
69 v8::Isolate* isolate = env->GetIsolate();
70 Heap* heap = reinterpret_cast<Isolate*>(isolate)->heap();
71
72 JSArrayBuffer* raw_ab = nullptr;
73 {
74 v8::HandleScope handle_scope(isolate);
75 Local<v8::ArrayBuffer> ab = v8::ArrayBuffer::New(isolate, 100);
76 Handle<JSArrayBuffer> buf = v8::Utils::OpenHandle(*ab);
77 VerifyTrackedInNewSpace(*buf);
78 GcAndSweep(heap, NEW_SPACE);
79 VerifyTrackedInNewSpace(*buf);
80 GcAndSweep(heap, NEW_SPACE);
81 VerifyTrackedInOldSpace(*buf);
82 GcAndSweep(heap, NEW_SPACE);
83 VerifyTrackedInOldSpace(*buf);
84 raw_ab = *buf;
85 }
86 // 2 GCs are needed because we promote to old space as live, meaning that
87 // we will survive one GC.
88 heap->CollectGarbage(OLD_SPACE);
89 heap->CollectGarbage(OLD_SPACE);
90 VerifyUntracked(raw_ab);
91 }
92
93 TEST(ArrayBuffer_ScavengeAndMC) {
94 CcTest::InitializeVM();
95 LocalContext env;
96 v8::Isolate* isolate = env->GetIsolate();
97 Heap* heap = reinterpret_cast<Isolate*>(isolate)->heap();
98
99 JSArrayBuffer* raw_ab = nullptr;
100 {
101 v8::HandleScope handle_scope(isolate);
102 Local<v8::ArrayBuffer> ab = v8::ArrayBuffer::New(isolate, 100);
103 Handle<JSArrayBuffer> buf = v8::Utils::OpenHandle(*ab);
104 VerifyTrackedInNewSpace(*buf);
105 GcAndSweep(heap, NEW_SPACE);
106 VerifyTrackedInNewSpace(*buf);
107 GcAndSweep(heap, NEW_SPACE);
108 VerifyTrackedInOldSpace(*buf);
109 GcAndSweep(heap, OLD_SPACE);
110 VerifyTrackedInOldSpace(*buf);
111 GcAndSweep(heap, NEW_SPACE);
112 VerifyTrackedInOldSpace(*buf);
113 raw_ab = *buf;
114 }
115 // 2 GCs are needed because we promote to old space as live, meaning that
116 // we will survive one GC.
117 GcAndSweep(heap, OLD_SPACE);
118 GcAndSweep(heap, OLD_SPACE);
119 VerifyUntracked(raw_ab);
120 }
121
122 TEST(ArrayBuffer_IterateNotYetDiscoveredEntries) {
123 CcTest::InitializeVM();
124 LocalContext env;
125 v8::Isolate* isolate = env->GetIsolate();
126 Heap* heap = reinterpret_cast<Isolate*>(isolate)->heap();
127
128 v8::HandleScope handle_scope(isolate);
129 Local<v8::ArrayBuffer> ab1 = v8::ArrayBuffer::New(isolate, 100);
130 Handle<JSArrayBuffer> buf1 = v8::Utils::OpenHandle(*ab1);
131 VerifyTrackedInNewSpace(*buf1);
132 GcAndSweep(heap, NEW_SPACE);
133 GcAndSweep(heap, NEW_SPACE);
134 VerifyTrackedInOldSpace(*buf1);
135
136 Local<v8::ArrayBuffer> ab2 = v8::ArrayBuffer::New(isolate, 100);
137 Handle<JSArrayBuffer> buf2 = v8::Utils::OpenHandle(*ab2);
138 Page* interesting_page = Page::FromAddress(buf2->address());
139 bool found_ab1 = false;
140 bool found_ab2 = false;
141
142 interesting_page->local_tracker()->IterateNotYetDiscoveredEntries(
143 [buf1, buf2, &found_ab1, &found_ab2](LocalTracker::Key key) {
144 if (key == *buf1) {
145 found_ab1 = true;
146 }
147 if (key == *buf2) {
148 found_ab2 = true;
149 }
150 return LocalTracker::kKeepEntry;
151 });
152 CHECK(!found_ab1);
153 CHECK(found_ab2);
154 }
155
156 TEST(ArrayBuffer_Compaction) {
157 FLAG_manual_evacuation_candidates_selection = true;
158 CcTest::InitializeVM();
159 LocalContext env;
160 v8::Isolate* isolate = env->GetIsolate();
161 Heap* heap = reinterpret_cast<Isolate*>(isolate)->heap();
162 AbandonCurrentlyFreeMemory(heap->old_space());
163
164 v8::HandleScope handle_scope(isolate);
165 Local<v8::ArrayBuffer> ab1 = v8::ArrayBuffer::New(isolate, 100);
166 Handle<JSArrayBuffer> buf1 = v8::Utils::OpenHandle(*ab1);
167 VerifyTrackedInNewSpace(*buf1);
168 GcAndSweep(heap, NEW_SPACE);
169 GcAndSweep(heap, NEW_SPACE);
170
171 Page* page_before_gc = Page::FromAddress(buf1->address());
172 page_before_gc->SetFlag(MemoryChunk::FORCE_EVACUATION_CANDIDATE_FOR_TESTING);
173 VerifyTrackedInOldSpace(*buf1);
174
175 heap->CollectAllGarbage();
176
177 Page* page_after_gc = Page::FromAddress(buf1->address());
178 VerifyTrackedInOldSpace(*buf1);
179
180 CHECK_NE(page_before_gc, page_after_gc);
181 }
182
183 } // namespace internal
184 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698