V8 API Reference, 7.2.502.16 (for Deno 0.2.4)
array-buffer-collector.cc
1 // Copyright 2017 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-collector.h"
6 
7 #include "src/base/template-utils.h"
8 #include "src/cancelable-task.h"
9 #include "src/heap/array-buffer-tracker.h"
10 #include "src/heap/gc-tracer.h"
11 #include "src/heap/heap-inl.h"
12 #include "src/task-utils.h"
13 
14 namespace v8 {
15 namespace internal {
16 
17 namespace {
18 
19 void FreeAllocationsHelper(
20  Heap* heap, const std::vector<JSArrayBuffer::Allocation>& allocations) {
21  for (JSArrayBuffer::Allocation alloc : allocations) {
22  JSArrayBuffer::FreeBackingStore(heap->isolate(), alloc);
23  }
24 }
25 
26 } // namespace
27 
28 void ArrayBufferCollector::QueueOrFreeGarbageAllocations(
29  std::vector<JSArrayBuffer::Allocation> allocations) {
30  if (heap_->ShouldReduceMemory()) {
31  FreeAllocationsHelper(heap_, allocations);
32  } else {
33  base::MutexGuard guard(&allocations_mutex_);
34  allocations_.push_back(std::move(allocations));
35  }
36 }
37 
38 void ArrayBufferCollector::PerformFreeAllocations() {
39  base::MutexGuard guard(&allocations_mutex_);
40  for (const std::vector<JSArrayBuffer::Allocation>& allocations :
41  allocations_) {
42  FreeAllocationsHelper(heap_, allocations);
43  }
44  allocations_.clear();
45 }
46 
47 void ArrayBufferCollector::FreeAllocations() {
48  // TODO(wez): Remove backing-store from external memory accounting.
49  heap_->account_external_memory_concurrently_freed();
50  if (!heap_->IsTearingDown() && !heap_->ShouldReduceMemory() &&
51  FLAG_concurrent_array_buffer_freeing) {
52  V8::GetCurrentPlatform()->CallOnWorkerThread(
53  MakeCancelableTask(heap_->isolate(), [this] {
54  TRACE_BACKGROUND_GC(
55  heap_->tracer(),
56  GCTracer::BackgroundScope::BACKGROUND_ARRAY_BUFFER_FREE);
57  PerformFreeAllocations();
58  }));
59  } else {
60  // Fallback for when concurrency is disabled/restricted. This is e.g. the
61  // case when the GC should reduce memory. For such GCs the
62  // QueueOrFreeGarbageAllocations() call would immediately free the
63  // allocations and this call would free already queued ones.
64  PerformFreeAllocations();
65  }
66 }
67 
68 } // namespace internal
69 } // namespace v8
Definition: libplatform.h:13