Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(343)

Unified Diff: src/heap/spaces-inl.h

Issue 1487853002: [heap] Move to LAB-based allocation for newspace evacuation. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Added comments describing LocalAllocationBuffer Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/heap/spaces.cc ('k') | test/cctest/cctest.gyp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/heap/spaces-inl.h
diff --git a/src/heap/spaces-inl.h b/src/heap/spaces-inl.h
index 76011768faf3d8e7f5337f4241f1742b5c0bc9e5..3023fbf51ead410fba6a14aaab99dff05e5acf61 100644
--- a/src/heap/spaces-inl.h
+++ b/src/heap/spaces-inl.h
@@ -5,6 +5,7 @@
#ifndef V8_HEAP_SPACES_INL_H_
#define V8_HEAP_SPACES_INL_H_
+#include "src/heap/incremental-marking.h"
#include "src/heap/spaces.h"
#include "src/isolate.h"
#include "src/msan.h"
@@ -49,20 +50,21 @@ Page* PageIterator::next() {
// SemiSpaceIterator
HeapObject* SemiSpaceIterator::Next() {
- if (current_ == limit_) return NULL;
- if (NewSpacePage::IsAtEnd(current_)) {
- NewSpacePage* page = NewSpacePage::FromLimit(current_);
- page = page->next_page();
- DCHECK(!page->is_anchor());
- current_ = page->area_start();
- if (current_ == limit_) return NULL;
+ while (current_ != limit_) {
+ if (NewSpacePage::IsAtEnd(current_)) {
+ NewSpacePage* page = NewSpacePage::FromLimit(current_);
+ page = page->next_page();
+ DCHECK(!page->is_anchor());
+ current_ = page->area_start();
+ if (current_ == limit_) return nullptr;
+ }
+ HeapObject* object = HeapObject::FromAddress(current_);
+ current_ += object->Size();
+ if (!object->IsFiller()) {
+ return object;
+ }
}
-
- HeapObject* object = HeapObject::FromAddress(current_);
- int size = object->Size();
-
- current_ += size;
- return object;
+ return nullptr;
}
@@ -319,6 +321,24 @@ HeapObject* PagedSpace::AllocateLinearly(int size_in_bytes) {
}
+AllocationResult LocalAllocationBuffer::AllocateRawAligned(
+ int size_in_bytes, AllocationAlignment alignment) {
+ Address current_top = allocation_info_.top();
+ int filler_size = Heap::GetFillToAlign(current_top, alignment);
+
+ Address new_top = current_top + filler_size + size_in_bytes;
+ if (new_top > allocation_info_.limit()) return AllocationResult::Retry();
+
+ allocation_info_.set_top(new_top);
+ if (filler_size > 0) {
+ return heap_->PrecedeWithFiller(HeapObject::FromAddress(current_top),
+ filler_size);
+ }
+
+ return AllocationResult(HeapObject::FromAddress(current_top));
+}
+
+
HeapObject* PagedSpace::AllocateLinearlyAligned(int* size_in_bytes,
AllocationAlignment alignment) {
Address current_top = allocation_info_.top();
@@ -482,6 +502,13 @@ AllocationResult NewSpace::AllocateRaw(int size_in_bytes,
}
+MUST_USE_RESULT inline AllocationResult NewSpace::AllocateRawSynchronized(
+ int size_in_bytes, AllocationAlignment alignment) {
+ base::LockGuard<base::Mutex> guard(&mutex_);
+ return AllocateRaw(size_in_bytes, alignment);
+}
+
+
LargePage* LargePage::Initialize(Heap* heap, MemoryChunk* chunk) {
heap->incremental_marking()->SetOldSpacePageFlags(chunk);
return static_cast<LargePage*>(chunk);
@@ -492,6 +519,34 @@ intptr_t LargeObjectSpace::Available() {
return ObjectSizeFor(heap()->isolate()->memory_allocator()->Available());
}
+
+LocalAllocationBuffer LocalAllocationBuffer::InvalidBuffer() {
+ return LocalAllocationBuffer(nullptr, AllocationInfo(nullptr, nullptr));
+}
+
+
+LocalAllocationBuffer LocalAllocationBuffer::FromResult(Heap* heap,
+ AllocationResult result,
+ intptr_t size) {
+ if (result.IsRetry()) return InvalidBuffer();
+ HeapObject* obj = nullptr;
+ bool ok = result.To(&obj);
+ USE(ok);
+ DCHECK(ok);
+ Address top = HeapObject::cast(obj)->address();
+ return LocalAllocationBuffer(heap, AllocationInfo(top, top + size));
+}
+
+
+bool LocalAllocationBuffer::TryMerge(LocalAllocationBuffer* other) {
+ if (allocation_info_.top() == other->allocation_info_.limit()) {
+ allocation_info_.set_top(other->allocation_info_.top());
+ other->allocation_info_.Reset(nullptr, nullptr);
+ return true;
+ }
+ return false;
+}
+
} // namespace internal
} // namespace v8
« no previous file with comments | « src/heap/spaces.cc ('k') | test/cctest/cctest.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698