Skip to content

Commit a99fe1f

Browse files
jeisingerCommit bot
authored andcommitted
Revert of Reland "Keep track of array buffers in new space separately" (patchset v8#2 id:20001 of https://codereview.chromium.org/1177083003/)
Reason for revert: Still broken Original issue's description: > Reland "Keep track of array buffers in new space separately" > > Original review https://codereview.chromium.org/1133773002/ > > BUG=v8:3996 > TBR=hpayer@chromium.org > LOG=n > > Committed: https://crrev.com/89b9a2cfb317e52186f682c91502b22932d52db3 > Cr-Commit-Position: refs/heads/master@{#28987} TBR=hpayer@chromium.org NOPRESUBMIT=true NOTREECHECKS=true NOTRY=true BUG=v8:3996 Review URL: https://codereview.chromium.org/1186613007 Cr-Commit-Position: refs/heads/master@{#29009}
1 parent 028025f commit a99fe1f

7 files changed

Lines changed: 37 additions & 177 deletions

File tree

src/api.cc

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6560,8 +6560,7 @@ v8::ArrayBuffer::Contents v8::ArrayBuffer::Externalize() {
65606560
Utils::ApiCheck(!self->is_external(), "v8::ArrayBuffer::Externalize",
65616561
"ArrayBuffer already externalized");
65626562
self->set_is_external(true);
6563-
isolate->heap()->UnregisterArrayBuffer(isolate->heap()->InNewSpace(*self),
6564-
self->backing_store());
6563+
isolate->heap()->UnregisterArrayBuffer(self->backing_store());
65656564

65666565
return GetContents();
65676566
}
@@ -6768,8 +6767,7 @@ v8::SharedArrayBuffer::Contents v8::SharedArrayBuffer::Externalize() {
67686767
Utils::ApiCheck(!self->is_external(), "v8::SharedArrayBuffer::Externalize",
67696768
"SharedArrayBuffer already externalized");
67706769
self->set_is_external(true);
6771-
isolate->heap()->UnregisterArrayBuffer(isolate->heap()->InNewSpace(*self),
6772-
self->backing_store());
6770+
isolate->heap()->UnregisterArrayBuffer(self->backing_store());
67736771
return GetContents();
67746772
}
67756773

src/heap/heap.cc

Lines changed: 25 additions & 115 deletions
Original file line numberDiff line numberDiff line change
@@ -1623,8 +1623,6 @@ void Heap::Scavenge() {
16231623

16241624
SelectScavengingVisitorsTable();
16251625

1626-
PrepareArrayBufferDiscoveryInNewSpace();
1627-
16281626
// Flip the semispaces. After flipping, to space is empty, from space has
16291627
// live objects.
16301628
new_space_.Flip();
@@ -1706,8 +1704,6 @@ void Heap::Scavenge() {
17061704
new_space_.LowerInlineAllocationLimit(
17071705
new_space_.inline_allocation_limit_step());
17081706

1709-
FreeDeadArrayBuffers(true);
1710-
17111707
// Update how much has survived scavenge.
17121708
IncrementYoungSurvivorsCounter(static_cast<int>(
17131709
(PromotedSpaceSizeOfObjects() - survived_watermark) + new_space_.Size()));
@@ -1801,122 +1797,46 @@ void Heap::ProcessNativeContexts(WeakObjectRetainer* retainer) {
18011797
}
18021798

18031799

1804-
void Heap::RegisterNewArrayBufferHelper(std::map<void*, size_t>& live_buffers,
1805-
void* data, size_t length) {
1806-
live_buffers[data] = length;
1807-
}
1808-
1809-
1810-
void Heap::UnregisterArrayBufferHelper(
1811-
std::map<void*, size_t>& live_buffers,
1812-
std::map<void*, size_t>& not_yet_discovered_buffers, void* data) {
1813-
DCHECK(live_buffers.count(data) > 0);
1814-
live_buffers.erase(data);
1815-
not_yet_discovered_buffers.erase(data);
1816-
}
1817-
1818-
1819-
void Heap::RegisterLiveArrayBufferHelper(
1820-
std::map<void*, size_t>& not_yet_discovered_buffers, void* data) {
1821-
not_yet_discovered_buffers.erase(data);
1822-
}
1823-
1824-
1825-
size_t Heap::FreeDeadArrayBuffersHelper(
1826-
Isolate* isolate, std::map<void*, size_t>& live_buffers,
1827-
std::map<void*, size_t>& not_yet_discovered_buffers) {
1828-
size_t freed_memory = 0;
1829-
for (auto buffer = not_yet_discovered_buffers.begin();
1830-
buffer != not_yet_discovered_buffers.end(); ++buffer) {
1831-
isolate->array_buffer_allocator()->Free(buffer->first, buffer->second);
1832-
freed_memory += buffer->second;
1833-
live_buffers.erase(buffer->first);
1834-
}
1835-
not_yet_discovered_buffers = live_buffers;
1836-
return freed_memory;
1837-
}
1838-
1839-
1840-
void Heap::TearDownArrayBuffersHelper(
1841-
Isolate* isolate, std::map<void*, size_t>& live_buffers,
1842-
std::map<void*, size_t>& not_yet_discovered_buffers) {
1843-
for (auto buffer = live_buffers.begin(); buffer != live_buffers.end();
1844-
++buffer) {
1845-
isolate->array_buffer_allocator()->Free(buffer->first, buffer->second);
1846-
}
1847-
live_buffers.clear();
1848-
not_yet_discovered_buffers.clear();
1849-
}
1850-
1851-
1852-
void Heap::RegisterNewArrayBuffer(bool in_new_space, void* data,
1853-
size_t length) {
1800+
void Heap::RegisterNewArrayBuffer(void* data, size_t length) {
18541801
if (!data) return;
1855-
RegisterNewArrayBufferHelper(
1856-
in_new_space ? live_new_array_buffers_ : live_array_buffers_, data,
1857-
length);
1802+
live_array_buffers_[data] = length;
18581803
reinterpret_cast<v8::Isolate*>(isolate_)
18591804
->AdjustAmountOfExternalAllocatedMemory(length);
18601805
}
18611806

18621807

1863-
void Heap::UnregisterArrayBuffer(bool in_new_space, void* data) {
1808+
void Heap::UnregisterArrayBuffer(void* data) {
18641809
if (!data) return;
1865-
UnregisterArrayBufferHelper(
1866-
in_new_space ? live_new_array_buffers_ : live_array_buffers_,
1867-
in_new_space ? not_yet_discovered_new_array_buffers_
1868-
: not_yet_discovered_array_buffers_,
1869-
data);
1810+
DCHECK(live_array_buffers_.count(data) > 0);
1811+
live_array_buffers_.erase(data);
1812+
not_yet_discovered_array_buffers_.erase(data);
18701813
}
18711814

18721815

1873-
void Heap::RegisterLiveArrayBuffer(bool in_new_space, void* data) {
1874-
// ArrayBuffer might be in the middle of being constructed.
1875-
if (data == undefined_value()) return;
1876-
RegisterLiveArrayBufferHelper(in_new_space
1877-
? not_yet_discovered_new_array_buffers_
1878-
: not_yet_discovered_array_buffers_,
1879-
data);
1816+
void Heap::RegisterLiveArrayBuffer(void* data) {
1817+
not_yet_discovered_array_buffers_.erase(data);
18801818
}
18811819

18821820

1883-
void Heap::FreeDeadArrayBuffers(bool in_new_space) {
1884-
size_t freed_memory = FreeDeadArrayBuffersHelper(
1885-
isolate_, in_new_space ? live_new_array_buffers_ : live_array_buffers_,
1886-
in_new_space ? not_yet_discovered_new_array_buffers_
1887-
: not_yet_discovered_array_buffers_);
1888-
if (freed_memory) {
1889-
reinterpret_cast<v8::Isolate*>(isolate_)
1890-
->AdjustAmountOfExternalAllocatedMemory(
1891-
-static_cast<int64_t>(freed_memory));
1821+
void Heap::FreeDeadArrayBuffers() {
1822+
for (auto buffer = not_yet_discovered_array_buffers_.begin();
1823+
buffer != not_yet_discovered_array_buffers_.end(); ++buffer) {
1824+
isolate_->array_buffer_allocator()->Free(buffer->first, buffer->second);
1825+
// Don't use the API method here since this could trigger another GC.
1826+
amount_of_external_allocated_memory_ -= buffer->second;
1827+
live_array_buffers_.erase(buffer->first);
18921828
}
1829+
not_yet_discovered_array_buffers_ = live_array_buffers_;
18931830
}
18941831

18951832

18961833
void Heap::TearDownArrayBuffers() {
1897-
TearDownArrayBuffersHelper(isolate_, live_array_buffers_,
1898-
not_yet_discovered_array_buffers_);
1899-
TearDownArrayBuffersHelper(isolate_, live_new_array_buffers_,
1900-
not_yet_discovered_new_array_buffers_);
1901-
}
1902-
1903-
1904-
void Heap::PrepareArrayBufferDiscoveryInNewSpace() {
1905-
not_yet_discovered_new_array_buffers_ = live_new_array_buffers_;
1906-
}
1907-
1908-
1909-
void Heap::PromoteArrayBuffer(Object* obj) {
1910-
JSArrayBuffer* buffer = JSArrayBuffer::cast(obj);
1911-
if (buffer->is_external()) return;
1912-
void* data = buffer->backing_store();
1913-
if (!data) return;
1914-
// ArrayBuffer might be in the middle of being constructed.
1915-
if (data == undefined_value()) return;
1916-
DCHECK(live_new_array_buffers_.count(data) > 0);
1917-
live_array_buffers_[data] = live_new_array_buffers_[data];
1918-
live_new_array_buffers_.erase(data);
1919-
not_yet_discovered_new_array_buffers_.erase(data);
1834+
for (auto buffer = live_array_buffers_.begin();
1835+
buffer != live_array_buffers_.end(); ++buffer) {
1836+
isolate_->array_buffer_allocator()->Free(buffer->first, buffer->second);
1837+
}
1838+
live_array_buffers_.clear();
1839+
not_yet_discovered_array_buffers_.clear();
19201840
}
19211841

19221842

@@ -2169,7 +2089,6 @@ class ScavengingVisitor : public StaticVisitorBase {
21692089
table_.Register(kVisitFixedDoubleArray, &EvacuateFixedDoubleArray);
21702090
table_.Register(kVisitFixedTypedArray, &EvacuateFixedTypedArray);
21712091
table_.Register(kVisitFixedFloat64Array, &EvacuateFixedFloat64Array);
2172-
table_.Register(kVisitJSArrayBuffer, &EvacuateJSArrayBuffer);
21732092

21742093
table_.Register(
21752094
kVisitNativeContext,
@@ -2199,6 +2118,9 @@ class ScavengingVisitor : public StaticVisitorBase {
21992118
table_.Register(kVisitJSWeakCollection,
22002119
&ObjectEvacuationStrategy<POINTER_OBJECT>::Visit);
22012120

2121+
table_.Register(kVisitJSArrayBuffer,
2122+
&ObjectEvacuationStrategy<POINTER_OBJECT>::Visit);
2123+
22022124
table_.Register(kVisitJSTypedArray,
22032125
&ObjectEvacuationStrategy<POINTER_OBJECT>::Visit);
22042126

@@ -2426,18 +2348,6 @@ class ScavengingVisitor : public StaticVisitorBase {
24262348
}
24272349

24282350

2429-
static inline void EvacuateJSArrayBuffer(Map* map, HeapObject** slot,
2430-
HeapObject* object) {
2431-
ObjectEvacuationStrategy<POINTER_OBJECT>::Visit(map, slot, object);
2432-
2433-
Heap* heap = map->GetHeap();
2434-
MapWord map_word = object->map_word();
2435-
DCHECK(map_word.IsForwardingAddress());
2436-
HeapObject* target = map_word.ToForwardingAddress();
2437-
if (!heap->InNewSpace(target)) heap->PromoteArrayBuffer(target);
2438-
}
2439-
2440-
24412351
static inline void EvacuateByteArray(Map* map, HeapObject** slot,
24422352
HeapObject* object) {
24432353
int object_size = reinterpret_cast<ByteArray*>(object)->ByteArraySize();

src/heap/heap.h

Lines changed: 5 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1567,28 +1567,10 @@ class Heap {
15671567

15681568
bool deserialization_complete() const { return deserialization_complete_; }
15691569

1570-
// The following methods are used to track raw C++ pointers to externally
1571-
// allocated memory used as backing store in live array buffers.
1572-
1573-
// A new ArrayBuffer was created with |data| as backing store.
1574-
void RegisterNewArrayBuffer(bool in_new_space, void* data, size_t length);
1575-
1576-
// The backing store |data| is no longer owned by V8.
1577-
void UnregisterArrayBuffer(bool in_new_space, void* data);
1578-
1579-
// A live ArrayBuffer was discovered during marking/scavenge.
1580-
void RegisterLiveArrayBuffer(bool in_new_space, void* data);
1581-
1582-
// Frees all backing store pointers that weren't discovered in the previous
1583-
// marking or scavenge phase.
1584-
void FreeDeadArrayBuffers(bool in_new_space);
1585-
1586-
// Prepare for a new scavenge phase. A new marking phase is implicitly
1587-
// prepared by finishing the previous one.
1588-
void PrepareArrayBufferDiscoveryInNewSpace();
1589-
1590-
// An ArrayBuffer moved from new space to old space.
1591-
void PromoteArrayBuffer(Object* buffer);
1570+
void RegisterNewArrayBuffer(void* data, size_t length);
1571+
void UnregisterArrayBuffer(void* data);
1572+
void RegisterLiveArrayBuffer(void* data);
1573+
void FreeDeadArrayBuffers();
15921574

15931575
protected:
15941576
// Methods made available to tests.
@@ -2092,24 +2074,9 @@ class Heap {
20922074
// the old space.
20932075
void EvaluateOldSpaceLocalPretenuring(uint64_t size_of_objects_before_gc);
20942076

2095-
// Called on heap tear-down. Frees all remaining ArrayBuffer backing stores.
2077+
// Called on heap tear-down.
20962078
void TearDownArrayBuffers();
20972079

2098-
// These correspond to the non-Helper versions.
2099-
void RegisterNewArrayBufferHelper(std::map<void*, size_t>& live_buffers,
2100-
void* data, size_t length);
2101-
void UnregisterArrayBufferHelper(
2102-
std::map<void*, size_t>& live_buffers,
2103-
std::map<void*, size_t>& not_yet_discovered_buffers, void* data);
2104-
void RegisterLiveArrayBufferHelper(
2105-
std::map<void*, size_t>& not_yet_discovered_buffers, void* data);
2106-
size_t FreeDeadArrayBuffersHelper(
2107-
Isolate* isolate, std::map<void*, size_t>& live_buffers,
2108-
std::map<void*, size_t>& not_yet_discovered_buffers);
2109-
void TearDownArrayBuffersHelper(
2110-
Isolate* isolate, std::map<void*, size_t>& live_buffers,
2111-
std::map<void*, size_t>& not_yet_discovered_buffers);
2112-
21132080
// Record statistics before and after garbage collection.
21142081
void ReportStatisticsBeforeGC();
21152082
void ReportStatisticsAfterGC();
@@ -2352,9 +2319,7 @@ class Heap {
23522319
bool concurrent_sweeping_enabled_;
23532320

23542321
std::map<void*, size_t> live_array_buffers_;
2355-
std::map<void*, size_t> live_new_array_buffers_;
23562322
std::map<void*, size_t> not_yet_discovered_array_buffers_;
2357-
std::map<void*, size_t> not_yet_discovered_new_array_buffers_;
23582323

23592324
struct StrongRootsList;
23602325
StrongRootsList* strong_roots_list_;

src/heap/mark-compact.cc

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3041,10 +3041,6 @@ bool MarkCompactCollector::TryPromoteObject(HeapObject* object,
30413041
AllocationResult allocation = old_space->AllocateRaw(object_size, alignment);
30423042
if (allocation.To(&target)) {
30433043
MigrateObject(target, object, object_size, old_space->identity());
3044-
// If we end up needing more special cases, we should factor this out.
3045-
if (V8_UNLIKELY(target->IsJSArrayBuffer())) {
3046-
heap()->PromoteArrayBuffer(target);
3047-
}
30483044
heap()->IncrementPromotedObjectsSize(object_size);
30493045
return true;
30503046
}
@@ -4371,6 +4367,7 @@ void MarkCompactCollector::SweepSpaces() {
43714367
#ifdef DEBUG
43724368
state_ = SWEEP_SPACES;
43734369
#endif
4370+
heap()->FreeDeadArrayBuffers();
43744371

43754372
MoveEvacuationCandidatesToEndOfPagesList();
43764373

@@ -4398,8 +4395,6 @@ void MarkCompactCollector::SweepSpaces() {
43984395

43994396
EvacuateNewSpaceAndCandidates();
44004397

4401-
heap()->FreeDeadArrayBuffers(false);
4402-
44034398
// ClearNonLiveReferences depends on precise sweeping of map space to
44044399
// detect whether unmarked map became dead in this collection or in one
44054400
// of the previous ones.

src/heap/objects-visiting-inl.h

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -85,10 +85,6 @@ int StaticNewSpaceVisitor<StaticVisitor>::VisitJSArrayBuffer(
8585
heap,
8686
HeapObject::RawField(object, JSArrayBuffer::BodyDescriptor::kStartOffset),
8787
HeapObject::RawField(object, JSArrayBuffer::kSizeWithInternalFields));
88-
if (!JSArrayBuffer::cast(object)->is_external()) {
89-
heap->RegisterLiveArrayBuffer(true,
90-
JSArrayBuffer::cast(object)->backing_store());
91-
}
9288
return JSArrayBuffer::kSizeWithInternalFields;
9389
}
9490

@@ -508,8 +504,7 @@ void StaticMarkingVisitor<StaticVisitor>::VisitJSArrayBuffer(
508504
HeapObject::RawField(object, JSArrayBuffer::BodyDescriptor::kStartOffset),
509505
HeapObject::RawField(object, JSArrayBuffer::kSizeWithInternalFields));
510506
if (!JSArrayBuffer::cast(object)->is_external()) {
511-
heap->RegisterLiveArrayBuffer(heap->InNewSpace(object),
512-
JSArrayBuffer::cast(object)->backing_store());
507+
heap->RegisterLiveArrayBuffer(JSArrayBuffer::cast(object)->backing_store());
513508
}
514509
}
515510

src/objects.cc

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16470,8 +16470,7 @@ Handle<JSArrayBuffer> JSTypedArray::MaterializeArrayBuffer(
1647016470
void* backing_store =
1647116471
isolate->array_buffer_allocator()->AllocateUninitialized(
1647216472
fixed_typed_array->DataSize());
16473-
isolate->heap()->RegisterNewArrayBuffer(isolate->heap()->InNewSpace(*buffer),
16474-
backing_store,
16473+
isolate->heap()->RegisterNewArrayBuffer(backing_store,
1647516474
fixed_typed_array->DataSize());
1647616475
buffer->set_backing_store(backing_store);
1647716476
buffer->set_is_external(false);

src/runtime/runtime-typedarray.cc

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,7 @@ void Runtime::SetupArrayBuffer(Isolate* isolate,
3434
array_buffer->set_byte_length(*byte_length);
3535

3636
if (data && !is_external) {
37-
isolate->heap()->RegisterNewArrayBuffer(
38-
isolate->heap()->InNewSpace(*array_buffer), data, allocated_length);
37+
isolate->heap()->RegisterNewArrayBuffer(data, allocated_length);
3938
}
4039
}
4140

@@ -151,8 +150,7 @@ RUNTIME_FUNCTION(Runtime_ArrayBufferNeuter) {
151150
size_t byte_length = NumberToSize(isolate, array_buffer->byte_length());
152151
array_buffer->set_is_external(true);
153152
Runtime::NeuterArrayBuffer(array_buffer);
154-
isolate->heap()->UnregisterArrayBuffer(
155-
isolate->heap()->InNewSpace(*array_buffer), backing_store);
153+
isolate->heap()->UnregisterArrayBuffer(backing_store);
156154
isolate->array_buffer_allocator()->Free(backing_store, byte_length);
157155
return isolate->heap()->undefined_value();
158156
}

0 commit comments

Comments
 (0)