| Index: src/heap/heap.cc
|
| diff --git a/src/heap/heap.cc b/src/heap/heap.cc
|
| index 086f5cd5a506df8511b52e55c7adc6d2e20a1f39..faaa85236109ee4c37595dde7eeca8980010c30e 100644
|
| --- a/src/heap/heap.cc
|
| +++ b/src/heap/heap.cc
|
| @@ -1744,61 +1744,13 @@ void Heap::ProcessNativeContexts(WeakObjectRetainer* retainer) {
|
| }
|
|
|
|
|
| -void Heap::RegisterNewArrayBufferHelper(std::map<void*, size_t>& live_buffers,
|
| - void* data, size_t length) {
|
| - live_buffers[data] = length;
|
| -}
|
| -
|
| -
|
| -void Heap::UnregisterArrayBufferHelper(
|
| - std::map<void*, size_t>& live_buffers,
|
| - std::map<void*, size_t>& not_yet_discovered_buffers, void* data) {
|
| - DCHECK(live_buffers.count(data) > 0);
|
| - live_buffers.erase(data);
|
| - not_yet_discovered_buffers.erase(data);
|
| -}
|
| -
|
| -
|
| -void Heap::RegisterLiveArrayBufferHelper(
|
| - std::map<void*, size_t>& not_yet_discovered_buffers, void* data) {
|
| - not_yet_discovered_buffers.erase(data);
|
| -}
|
| -
|
| -
|
| -size_t Heap::FreeDeadArrayBuffersHelper(
|
| - Isolate* isolate, std::map<void*, size_t>& live_buffers,
|
| - std::map<void*, size_t>& not_yet_discovered_buffers) {
|
| - size_t freed_memory = 0;
|
| - for (auto buffer = not_yet_discovered_buffers.begin();
|
| - buffer != not_yet_discovered_buffers.end(); ++buffer) {
|
| - isolate->array_buffer_allocator()->Free(buffer->first, buffer->second);
|
| - freed_memory += buffer->second;
|
| - live_buffers.erase(buffer->first);
|
| - }
|
| - not_yet_discovered_buffers = live_buffers;
|
| - return freed_memory;
|
| -}
|
| -
|
| -
|
| -void Heap::TearDownArrayBuffersHelper(
|
| - Isolate* isolate, std::map<void*, size_t>& live_buffers,
|
| - std::map<void*, size_t>& not_yet_discovered_buffers) {
|
| - for (auto buffer = live_buffers.begin(); buffer != live_buffers.end();
|
| - ++buffer) {
|
| - isolate->array_buffer_allocator()->Free(buffer->first, buffer->second);
|
| - }
|
| - live_buffers.clear();
|
| - not_yet_discovered_buffers.clear();
|
| -}
|
| -
|
| -
|
| void Heap::RegisterNewArrayBuffer(bool in_new_space, void* data,
|
| size_t length) {
|
| if (!data) return;
|
| - RegisterNewArrayBufferHelper(live_array_buffers_, data, length);
|
| if (in_new_space) {
|
| - RegisterNewArrayBufferHelper(live_array_buffers_for_scavenge_, data,
|
| - length);
|
| + live_array_buffers_for_scavenge_[data] = length;
|
| + } else {
|
| + live_array_buffers_[data] = length;
|
| }
|
|
|
| // We may go over the limit of externally allocated memory here. We call the
|
| @@ -1810,54 +1762,79 @@ void Heap::RegisterNewArrayBuffer(bool in_new_space, void* data,
|
|
|
| void Heap::UnregisterArrayBuffer(bool in_new_space, void* data) {
|
| if (!data) return;
|
| - UnregisterArrayBufferHelper(live_array_buffers_,
|
| - not_yet_discovered_array_buffers_, data);
|
| - if (in_new_space) {
|
| - UnregisterArrayBufferHelper(live_array_buffers_for_scavenge_,
|
| - not_yet_discovered_array_buffers_for_scavenge_,
|
| - data);
|
| - }
|
| +
|
| + std::map<void*, size_t>* live_buffers =
|
| + in_new_space ? &live_array_buffers_for_scavenge_ : &live_array_buffers_;
|
| + std::map<void*, size_t>* not_yet_discovered_buffers =
|
| + in_new_space ? ¬_yet_discovered_array_buffers_for_scavenge_
|
| + : ¬_yet_discovered_array_buffers_;
|
| +
|
| + DCHECK(live_buffers->count(data) > 0);
|
| +
|
| + size_t length = (*live_buffers)[data];
|
| + live_buffers->erase(data);
|
| + not_yet_discovered_buffers->erase(data);
|
| +
|
| + amount_of_external_allocated_memory_ -= length;
|
| }
|
|
|
|
|
| -void Heap::RegisterLiveArrayBuffer(bool from_scavenge, void* data) {
|
| +void Heap::RegisterLiveArrayBuffer(bool in_new_space, void* data) {
|
| // ArrayBuffer might be in the middle of being constructed.
|
| if (data == undefined_value()) return;
|
| - RegisterLiveArrayBufferHelper(
|
| - from_scavenge ? not_yet_discovered_array_buffers_for_scavenge_
|
| - : not_yet_discovered_array_buffers_,
|
| - data);
|
| + if (in_new_space) {
|
| + not_yet_discovered_array_buffers_for_scavenge_.erase(data);
|
| + } else {
|
| + not_yet_discovered_array_buffers_.erase(data);
|
| + }
|
| }
|
|
|
|
|
| void Heap::FreeDeadArrayBuffers(bool from_scavenge) {
|
| - if (from_scavenge) {
|
| - for (auto& buffer : not_yet_discovered_array_buffers_for_scavenge_) {
|
| - not_yet_discovered_array_buffers_.erase(buffer.first);
|
| - live_array_buffers_.erase(buffer.first);
|
| - }
|
| - } else {
|
| + size_t freed_memory = 0;
|
| + for (auto& buffer : not_yet_discovered_array_buffers_for_scavenge_) {
|
| + isolate()->array_buffer_allocator()->Free(buffer.first, buffer.second);
|
| + freed_memory += buffer.second;
|
| + live_array_buffers_for_scavenge_.erase(buffer.first);
|
| + }
|
| +
|
| + if (!from_scavenge) {
|
| for (auto& buffer : not_yet_discovered_array_buffers_) {
|
| - // Scavenge can't happend during evacuation, so we only need to update
|
| - // live_array_buffers_for_scavenge_.
|
| - // not_yet_discovered_array_buffers_for_scanvenge_ will be reset before
|
| - // the next scavenge run in PrepareArrayBufferDiscoveryInNewSpace.
|
| - live_array_buffers_for_scavenge_.erase(buffer.first);
|
| + isolate()->array_buffer_allocator()->Free(buffer.first, buffer.second);
|
| + freed_memory += buffer.second;
|
| + live_array_buffers_.erase(buffer.first);
|
| }
|
| }
|
|
|
| + not_yet_discovered_array_buffers_for_scavenge_ =
|
| + live_array_buffers_for_scavenge_;
|
| + if (!from_scavenge) not_yet_discovered_array_buffers_ = live_array_buffers_;
|
| +
|
| // Do not call through the api as this code is triggered while doing a GC.
|
| - amount_of_external_allocated_memory_ -= FreeDeadArrayBuffersHelper(
|
| - isolate_,
|
| - from_scavenge ? live_array_buffers_for_scavenge_ : live_array_buffers_,
|
| - from_scavenge ? not_yet_discovered_array_buffers_for_scavenge_
|
| - : not_yet_discovered_array_buffers_);
|
| + amount_of_external_allocated_memory_ -= freed_memory;
|
| }
|
|
|
|
|
| void Heap::TearDownArrayBuffers() {
|
| - TearDownArrayBuffersHelper(isolate_, live_array_buffers_,
|
| - not_yet_discovered_array_buffers_);
|
| + size_t freed_memory = 0;
|
| + for (auto& buffer : live_array_buffers_) {
|
| + isolate()->array_buffer_allocator()->Free(buffer.first, buffer.second);
|
| + freed_memory += buffer.second;
|
| + }
|
| + for (auto& buffer : live_array_buffers_for_scavenge_) {
|
| + isolate()->array_buffer_allocator()->Free(buffer.first, buffer.second);
|
| + freed_memory += buffer.second;
|
| + }
|
| + live_array_buffers_.clear();
|
| + live_array_buffers_for_scavenge_.clear();
|
| + not_yet_discovered_array_buffers_.clear();
|
| + not_yet_discovered_array_buffers_for_scavenge_.clear();
|
| +
|
| + if (freed_memory > 0) {
|
| + reinterpret_cast<v8::Isolate*>(isolate_)
|
| + ->AdjustAmountOfExternalAllocatedMemory(
|
| + -static_cast<int64_t>(freed_memory));
|
| + }
|
| }
|
|
|
|
|
| @@ -1875,7 +1852,7 @@ void Heap::PromoteArrayBuffer(Object* obj) {
|
| // ArrayBuffer might be in the middle of being constructed.
|
| if (data == undefined_value()) return;
|
| DCHECK(live_array_buffers_for_scavenge_.count(data) > 0);
|
| - DCHECK(live_array_buffers_.count(data) > 0);
|
| + live_array_buffers_[data] = live_array_buffers_for_scavenge_[data];
|
| live_array_buffers_for_scavenge_.erase(data);
|
| not_yet_discovered_array_buffers_for_scavenge_.erase(data);
|
| }
|
|
|