diff options
| author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2020-10-12 14:27:29 +0200 |
|---|---|---|
| committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2020-10-13 09:35:20 +0000 |
| commit | c30a6232df03e1efbd9f3b226777b07e087a1122 (patch) | |
| tree | e992f45784689f373bcc38d1b79a239ebe17ee23 /chromium/v8/src/heap/cppgc/heap-base.cc | |
| parent | 7b5b123ac58f58ffde0f4f6e488bcd09aa4decd3 (diff) | |
BASELINE: Update Chromium to 85.0.4183.14085-based
Change-Id: Iaa42f4680837c57725b1344f108c0196741f6057
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'chromium/v8/src/heap/cppgc/heap-base.cc')
| -rw-r--r-- | chromium/v8/src/heap/cppgc/heap-base.cc | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/chromium/v8/src/heap/cppgc/heap-base.cc b/chromium/v8/src/heap/cppgc/heap-base.cc new file mode 100644 index 00000000000..7963df0af3f --- /dev/null +++ b/chromium/v8/src/heap/cppgc/heap-base.cc @@ -0,0 +1,88 @@ +// Copyright 2020 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/cppgc/heap-base.h" + +#include "src/base/bounded-page-allocator.h" +#include "src/base/platform/platform.h" +#include "src/heap/base/stack.h" +#include "src/heap/cppgc/globals.h" +#include "src/heap/cppgc/heap-object-header-inl.h" +#include "src/heap/cppgc/heap-page-inl.h" +#include "src/heap/cppgc/heap-visitor.h" +#include "src/heap/cppgc/marker.h" +#include "src/heap/cppgc/page-memory.h" +#include "src/heap/cppgc/prefinalizer-handler.h" +#include "src/heap/cppgc/stats-collector.h" + +namespace cppgc { +namespace internal { + +namespace { + +class ObjectSizeCounter : private HeapVisitor<ObjectSizeCounter> { + friend class HeapVisitor<ObjectSizeCounter>; + + public: + size_t GetSize(RawHeap* heap) { + Traverse(heap); + return accumulated_size_; + } + + private: + static size_t ObjectSize(const HeapObjectHeader* header) { + const size_t size = + header->IsLargeObject() + ? static_cast<const LargePage*>(BasePage::FromPayload(header)) + ->PayloadSize() + : header->GetSize(); + DCHECK_GE(size, sizeof(HeapObjectHeader)); + return size - sizeof(HeapObjectHeader); + } + + bool VisitHeapObjectHeader(HeapObjectHeader* header) { + if (header->IsFree()) return true; + accumulated_size_ += ObjectSize(header); + return true; + } + + size_t accumulated_size_ = 0; +}; + +} // namespace + +HeapBase::HeapBase(std::shared_ptr<cppgc::Platform> platform, + size_t custom_spaces) + : raw_heap_(this, custom_spaces), + platform_(std::move(platform)), +#if defined(CPPGC_CAGED_HEAP) + caged_heap_(this, platform_->GetPageAllocator()), + page_backend_(std::make_unique<PageBackend>(&caged_heap_.allocator())), +#else + page_backend_( + std::make_unique<PageBackend>(platform_->GetPageAllocator())), +#endif + stats_collector_(std::make_unique<StatsCollector>()), + stack_(std::make_unique<heap::base::Stack>( + v8::base::Stack::GetStackStart())), + prefinalizer_handler_(std::make_unique<PreFinalizerHandler>()), + object_allocator_(&raw_heap_, page_backend_.get(), + stats_collector_.get()), + sweeper_(&raw_heap_, platform_.get(), stats_collector_.get()) { +} + +HeapBase::~HeapBase() = default; + +size_t HeapBase::ObjectPayloadSize() const { + return ObjectSizeCounter().GetSize(const_cast<RawHeap*>(&raw_heap())); +} + +HeapBase::NoGCScope::NoGCScope(HeapBase& heap) : heap_(heap) { + heap_.no_gc_scope_++; +} + +HeapBase::NoGCScope::~NoGCScope() { heap_.no_gc_scope_--; } + +} // namespace internal +} // namespace cppgc |
