| // Copyright 2017 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/array-buffer-collector.h" |
| |
| #include "src/base/template-utils.h" |
| #include "src/heap/array-buffer-tracker.h" |
| #include "src/heap/gc-tracer.h" |
| #include "src/heap/heap-inl.h" |
| #include "src/tasks/cancelable-task.h" |
| #include "src/tasks/task-utils.h" |
| |
| namespace v8 { |
| namespace internal { |
| |
| void ArrayBufferCollector::QueueOrFreeGarbageAllocations( |
| std::vector<std::shared_ptr<BackingStore>> backing_stores) { |
| if (heap_->ShouldReduceMemory()) { |
| // Destruct the vector, which destructs the std::shared_ptrs, freeing |
| // the backing stores. |
| backing_stores.clear(); |
| } else { |
| base::MutexGuard guard(&allocations_mutex_); |
| allocations_.push_back(std::move(backing_stores)); |
| } |
| } |
| |
| void ArrayBufferCollector::PerformFreeAllocations() { |
| base::MutexGuard guard(&allocations_mutex_); |
| // Destruct the vector, which destructs the vecotr of std::shared_ptrs, |
| // freeing the backing stores if their refcount drops to zero. |
| allocations_.clear(); |
| } |
| |
| void ArrayBufferCollector::FreeAllocations() { |
| // TODO(wez): Remove backing-store from external memory accounting. |
| heap_->account_external_memory_concurrently_freed(); |
| if (!heap_->IsTearingDown() && !heap_->ShouldReduceMemory() && |
| FLAG_concurrent_array_buffer_freeing) { |
| V8::GetCurrentPlatform()->CallOnWorkerThread( |
| MakeCancelableTask(heap_->isolate(), [this] { |
| TRACE_BACKGROUND_GC( |
| heap_->tracer(), |
| GCTracer::BackgroundScope::BACKGROUND_ARRAY_BUFFER_FREE); |
| PerformFreeAllocations(); |
| })); |
| } else { |
| // Fallback for when concurrency is disabled/restricted. This is e.g. the |
| // case when the GC should reduce memory. For such GCs the |
| // QueueOrFreeGarbageAllocations() call would immediately free the |
| // allocations and this call would free already queued ones. |
| PerformFreeAllocations(); |
| } |
| } |
| |
| } // namespace internal |
| } // namespace v8 |