blob: 6858454fa8adf6709bbeafb06b04ee1ef1dc61ce [file] [log] [blame] [edit]
// Copyright 2011 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.
#ifndef V8_HEAP_SPACES_INL_H_
#define V8_HEAP_SPACES_INL_H_
#include "src/heap/spaces.h"
// Include the non-inl header before the rest of the headers.
#include "src/base/atomic-utils.h"
#include "src/common/globals.h"
#include "src/heap/heap.h"
#include "src/heap/large-spaces.h"
#include "src/heap/main-allocator-inl.h"
#include "src/heap/mutable-page-metadata-inl.h"
#include "src/heap/new-spaces.h"
#include "src/heap/paged-spaces.h"
namespace v8 {
namespace internal {
template <class PageType>
PageIteratorImpl<PageType>& PageIteratorImpl<PageType>::operator++() {
p_ = p_->next_page();
return *this;
}
template <class PageType>
PageIteratorImpl<PageType> PageIteratorImpl<PageType>::operator++(int) {
PageIteratorImpl<PageType> tmp(*this);
operator++();
return tmp;
}
void Space::IncrementExternalBackingStoreBytes(ExternalBackingStoreType type,
size_t amount) {
base::CheckedIncrement(&external_backing_store_bytes_[static_cast<int>(type)],
amount);
heap()->IncrementExternalBackingStoreBytes(type, amount);
}
void Space::DecrementExternalBackingStoreBytes(ExternalBackingStoreType type,
size_t amount) {
base::CheckedDecrement(&external_backing_store_bytes_[static_cast<int>(type)],
amount);
heap()->DecrementExternalBackingStoreBytes(type, amount);
}
void Space::MoveExternalBackingStoreBytes(ExternalBackingStoreType type,
Space* from, Space* to,
size_t amount) {
if (from == to) return;
base::CheckedDecrement(
&(from->external_backing_store_bytes_[static_cast<int>(type)]), amount);
base::CheckedIncrement(
&(to->external_backing_store_bytes_[static_cast<int>(type)]), amount);
}
PageRange::PageRange(PageMetadata* page) : PageRange(page, page->next_page()) {}
ConstPageRange::ConstPageRange(const PageMetadata* page)
: ConstPageRange(page, page->next_page()) {}
OldGenerationMemoryChunkIterator::OldGenerationMemoryChunkIterator(Heap* heap)
: heap_(heap), state_(kOldSpace), iterator_(heap->old_space()->begin()) {}
MutablePageMetadata* OldGenerationMemoryChunkIterator::next() {
switch (state_) {
case kOldSpace: {
PageIterator& iterator = std::get<PageIterator>(iterator_);
if (iterator != heap_->old_space()->end()) return *(iterator++);
state_ = kCodeSpace;
iterator_ = heap_->code_space()->begin();
[[fallthrough]];
}
case kCodeSpace: {
PageIterator& iterator = std::get<PageIterator>(iterator_);
if (iterator != heap_->code_space()->end()) return *(iterator++);
state_ = kLargeObjectSpace;
iterator_ = heap_->lo_space()->begin();
[[fallthrough]];
}
case kLargeObjectSpace: {
LargePageIterator& iterator = std::get<LargePageIterator>(iterator_);
if (iterator != heap_->lo_space()->end()) return *(iterator++);
state_ = kCodeLargeObjectSpace;
iterator_ = heap_->code_lo_space()->begin();
[[fallthrough]];
}
case kCodeLargeObjectSpace: {
LargePageIterator& iterator = std::get<LargePageIterator>(iterator_);
if (iterator != heap_->code_lo_space()->end()) return *(iterator++);
state_ = kTrustedSpace;
iterator_ = heap_->trusted_space()->begin();
[[fallthrough]];
}
case kTrustedSpace: {
PageIterator& iterator = std::get<PageIterator>(iterator_);
if (iterator != heap_->trusted_space()->end()) return *(iterator++);
state_ = kTrustedLargeObjectSpace;
iterator_ = heap_->trusted_lo_space()->begin();
[[fallthrough]];
}
case kTrustedLargeObjectSpace: {
LargePageIterator& iterator = std::get<LargePageIterator>(iterator_);
if (iterator != heap_->trusted_lo_space()->end()) return *(iterator++);
state_ = kFinished;
[[fallthrough]];
}
case kFinished:
return nullptr;
}
}
bool MemoryChunkIterator::HasNext() {
if (current_chunk_) return true;
while (space_iterator_.HasNext()) {
Space* space = space_iterator_.Next();
current_chunk_ = space->first_page();
if (current_chunk_) return true;
}
return false;
}
MutablePageMetadata* MemoryChunkIterator::Next() {
MutablePageMetadata* chunk = current_chunk_;
current_chunk_ = chunk->list_node().next();
return chunk;
}
} // namespace internal
} // namespace v8
#endif // V8_HEAP_SPACES_INL_H_