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

Unified Diff: src/heap/spaces.h

Issue 2406363002: [heap] Use size_t in free list and evacuation candidate selection. (Closed)
Patch Set: fix typo Created 4 years, 2 months 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/mark-compact.cc ('k') | src/heap/spaces.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/heap/spaces.h
diff --git a/src/heap/spaces.h b/src/heap/spaces.h
index b990bb3b359c14b4b69d5d8588ae7636164d9c56..5d22e4bc58ed80fcd4dedd45d60878cec9fd0aa8 100644
--- a/src/heap/spaces.h
+++ b/src/heap/spaces.h
@@ -135,7 +135,8 @@ enum FreeMode { kLinkCategory, kDoNotLinkCategory };
class FreeListCategory {
public:
static const int kSize = kIntSize + // FreeListCategoryType type_
- kIntSize + // int available_
+ kIntSize + // padding for type_
+ kSizetSize + // size_t available_
kPointerSize + // FreeSpace* top_
kPointerSize + // FreeListCategory* prev_
kPointerSize; // FreeListCategory* next_
@@ -167,28 +168,28 @@ class FreeListCategory {
// category is currently unlinked.
void Relink();
- bool Free(FreeSpace* node, int size_in_bytes, FreeMode mode);
+ bool Free(FreeSpace* node, size_t size_in_bytes, FreeMode mode);
// Picks a node from the list and stores its size in |node_size|. Returns
// nullptr if the category is empty.
- FreeSpace* PickNodeFromList(int* node_size);
+ FreeSpace* PickNodeFromList(size_t* node_size);
// Performs a single try to pick a node of at least |minimum_size| from the
// category. Stores the actual size in |node_size|. Returns nullptr if no
// node is found.
- FreeSpace* TryPickNodeFromList(int minimum_size, int* node_size);
+ FreeSpace* TryPickNodeFromList(size_t minimum_size, size_t* node_size);
// Picks a node of at least |minimum_size| from the category. Stores the
// actual size in |node_size|. Returns nullptr if no node is found.
- FreeSpace* SearchForNodeInList(int minimum_size, int* node_size);
+ FreeSpace* SearchForNodeInList(size_t minimum_size, size_t* node_size);
inline FreeList* owner();
inline bool is_linked();
bool is_empty() { return top() == nullptr; }
- int available() const { return available_; }
+ size_t available() const { return available_; }
#ifdef DEBUG
- intptr_t SumFreeList();
+ size_t SumFreeList();
int FreeListLength();
#endif
@@ -211,7 +212,7 @@ class FreeListCategory {
// |available_|: Total available bytes in all blocks of this free list
// category.
- int available_;
+ size_t available_;
// |top_|: Points to the top FreeSpace* in the free list category.
FreeSpace* top_;
@@ -320,26 +321,26 @@ class MemoryChunk {
static const intptr_t kFlagsOffset = kSizeOffset + kPointerSize;
static const size_t kMinHeaderSize =
- kSizeOffset + kPointerSize // size_t size
- + kIntptrSize // Flags flags_
- + kPointerSize // Address area_start_
- + kPointerSize // Address area_end_
- + 2 * kPointerSize // base::VirtualMemory reservation_
- + kPointerSize // Address owner_
- + kPointerSize // Heap* heap_
- + kIntSize // int progress_bar_
- + kIntSize // int live_bytes_count_
- + kPointerSize // SlotSet* old_to_new_slots_
- + kPointerSize // SlotSet* old_to_old_slots_
- + kPointerSize // TypedSlotSet* typed_old_to_new_slots_
- + kPointerSize // TypedSlotSet* typed_old_to_old_slots_
- + kPointerSize // SkipList* skip_list_
- + kPointerSize // AtomicValue high_water_mark_
- + kPointerSize // base::Mutex* mutex_
- + kPointerSize // base::AtomicWord concurrent_sweeping_
- + 2 * kPointerSize // AtomicNumber free-list statistics
- + kPointerSize // AtomicValue next_chunk_
- + kPointerSize // AtomicValue prev_chunk_
+ kSizeOffset + kSizetSize // size_t size
+ + kIntptrSize // Flags flags_
+ + kPointerSize // Address area_start_
+ + kPointerSize // Address area_end_
+ + 2 * kPointerSize // base::VirtualMemory reservation_
+ + kPointerSize // Address owner_
+ + kPointerSize // Heap* heap_
+ + kIntSize // int progress_bar_
+ + kIntSize // int live_bytes_count_
+ + kPointerSize // SlotSet* old_to_new_slots_
+ + kPointerSize // SlotSet* old_to_old_slots_
+ + kPointerSize // TypedSlotSet* typed_old_to_new_slots_
+ + kPointerSize // TypedSlotSet* typed_old_to_old_slots_
+ + kPointerSize // SkipList* skip_list_
+ + kPointerSize // AtomicValue high_water_mark_
+ + kPointerSize // base::Mutex* mutex_
+ + kPointerSize // base::AtomicWord concurrent_sweeping_
+ + 2 * kSizetSize // AtomicNumber free-list statistics
+ + kPointerSize // AtomicValue next_chunk_
+ + kPointerSize // AtomicValue prev_chunk_
// FreeListCategory categories_[kNumberOfCategories]
+ FreeListCategory::kSize * kNumberOfCategories +
kPointerSize // LocalArrayBufferTracker* local_tracker_
@@ -459,7 +460,7 @@ class MemoryChunk {
Address area_start() { return area_start_; }
Address area_end() { return area_end_; }
- int area_size() { return static_cast<int>(area_end() - area_start()); }
+ size_t area_size() { return static_cast<size_t>(area_end() - area_start()); }
bool CommitArea(size_t requested);
@@ -749,13 +750,10 @@ class Page : public MemoryChunk {
}
// Returns the offset of a given address to this page.
- inline int Offset(Address a) {
- int offset = static_cast<int>(a - address());
- return offset;
- }
+ inline size_t Offset(Address a) { return static_cast<size_t>(a - address()); }
// Returns the address for a given offset to the this page.
- Address OffsetToAddress(int offset) {
+ Address OffsetToAddress(size_t offset) {
DCHECK_PAGE_OFFSET(offset);
return address() + offset;
}
@@ -775,9 +773,11 @@ class Page : public MemoryChunk {
void ResetFreeListStatistics();
- int LiveBytesFromFreeList() {
- return static_cast<int>(area_size() - wasted_memory() -
- available_in_free_list());
+ size_t AvailableInFreeList();
+
+ size_t LiveBytesFromFreeList() {
+ DCHECK_GE(area_size(), wasted_memory() + available_in_free_list());
+ return area_size() - wasted_memory() - available_in_free_list();
}
FreeListCategory* free_list_category(FreeListCategoryType type) {
@@ -786,12 +786,18 @@ class Page : public MemoryChunk {
bool is_anchor() { return IsFlagSet(Page::ANCHOR); }
- intptr_t wasted_memory() { return wasted_memory_.Value(); }
- void add_wasted_memory(intptr_t waste) { wasted_memory_.Increment(waste); }
- intptr_t available_in_free_list() { return available_in_free_list_.Value(); }
- void add_available_in_free_list(intptr_t available) {
+ size_t wasted_memory() { return wasted_memory_.Value(); }
+ void add_wasted_memory(size_t waste) { wasted_memory_.Increment(waste); }
+ size_t available_in_free_list() { return available_in_free_list_.Value(); }
+ void add_available_in_free_list(size_t available) {
+ DCHECK_LE(available, area_size());
available_in_free_list_.Increment(available);
}
+ void remove_available_in_free_list(size_t available) {
+ DCHECK_LE(available, area_size());
+ DCHECK_GE(available_in_free_list(), available);
+ available_in_free_list_.Decrement(available);
+ }
size_t ShrinkToHighWaterMark();
@@ -1693,12 +1699,12 @@ class FreeList {
// was too small. Bookkeeping information will be written to the block, i.e.,
// its contents will be destroyed. The start address should be word aligned,
// and the size should be a non-zero multiple of the word size.
- int Free(Address start, int size_in_bytes, FreeMode mode);
+ size_t Free(Address start, size_t size_in_bytes, FreeMode mode);
// Allocate a block of size {size_in_bytes} from the free list. The block is
// unitialized. A failure is returned if no block is available. The size
// should be a non-zero multiple of the word size.
- MUST_USE_RESULT HeapObject* Allocate(int size_in_bytes);
+ MUST_USE_RESULT HeapObject* Allocate(size_t size_in_bytes);
// Clear the free list.
void Reset();
@@ -1729,11 +1735,11 @@ class FreeList {
// Used after booting the VM.
void RepairLists(Heap* heap);
- intptr_t EvictFreeListItems(Page* page);
+ size_t EvictFreeListItems(Page* page);
bool ContainsPageFreeListItems(Page* page);
PagedSpace* owner() { return owner_; }
- intptr_t wasted_bytes() { return wasted_bytes_.Value(); }
+ size_t wasted_bytes() { return wasted_bytes_.Value(); }
template <typename Callback>
void ForAllFreeListCategories(FreeListCategoryType type, Callback callback) {
@@ -1757,7 +1763,7 @@ class FreeList {
void PrintCategories(FreeListCategoryType type);
#ifdef DEBUG
- intptr_t SumFreeLists();
+ size_t SumFreeLists();
bool IsVeryLong();
#endif
@@ -1781,33 +1787,33 @@ class FreeList {
};
// The size range of blocks, in bytes.
- static const int kMinBlockSize = 3 * kPointerSize;
- static const int kMaxBlockSize = Page::kAllocatableMemory;
+ static const size_t kMinBlockSize = 3 * kPointerSize;
+ static const size_t kMaxBlockSize = Page::kAllocatableMemory;
- static const int kTiniestListMax = 0xa * kPointerSize;
- static const int kTinyListMax = 0x1f * kPointerSize;
- static const int kSmallListMax = 0xff * kPointerSize;
- static const int kMediumListMax = 0x7ff * kPointerSize;
- static const int kLargeListMax = 0x3fff * kPointerSize;
- static const int kTinyAllocationMax = kTiniestListMax;
- static const int kSmallAllocationMax = kTinyListMax;
- static const int kMediumAllocationMax = kSmallListMax;
- static const int kLargeAllocationMax = kMediumListMax;
+ static const size_t kTiniestListMax = 0xa * kPointerSize;
+ static const size_t kTinyListMax = 0x1f * kPointerSize;
+ static const size_t kSmallListMax = 0xff * kPointerSize;
+ static const size_t kMediumListMax = 0x7ff * kPointerSize;
+ static const size_t kLargeListMax = 0x3fff * kPointerSize;
+ static const size_t kTinyAllocationMax = kTiniestListMax;
+ static const size_t kSmallAllocationMax = kTinyListMax;
+ static const size_t kMediumAllocationMax = kSmallListMax;
+ static const size_t kLargeAllocationMax = kMediumListMax;
- FreeSpace* FindNodeFor(int size_in_bytes, int* node_size);
+ FreeSpace* FindNodeFor(size_t size_in_bytes, size_t* node_size);
// Walks all available categories for a given |type| and tries to retrieve
// a node. Returns nullptr if the category is empty.
- FreeSpace* FindNodeIn(FreeListCategoryType type, int* node_size);
+ FreeSpace* FindNodeIn(FreeListCategoryType type, size_t* node_size);
// Tries to retrieve a node from the first category in a given |type|.
// Returns nullptr if the category is empty.
- FreeSpace* TryFindNodeIn(FreeListCategoryType type, int* node_size,
- int minimum_size);
+ FreeSpace* TryFindNodeIn(FreeListCategoryType type, size_t* node_size,
+ size_t minimum_size);
// Searches a given |type| for a node of at least |minimum_size|.
- FreeSpace* SearchForNodeInList(FreeListCategoryType type, int* node_size,
- int minimum_size);
+ FreeSpace* SearchForNodeInList(FreeListCategoryType type, size_t* node_size,
+ size_t minimum_size);
FreeListCategoryType SelectFreeListCategoryType(size_t size_in_bytes) {
if (size_in_bytes <= kTiniestListMax) {
@@ -1840,7 +1846,7 @@ class FreeList {
FreeListCategory* top(FreeListCategoryType type) { return categories_[type]; }
PagedSpace* owner_;
- base::AtomicNumber<intptr_t> wasted_bytes_;
+ base::AtomicNumber<size_t> wasted_bytes_;
FreeListCategory* categories_[kNumberOfCategories];
friend class FreeListCategory;
@@ -2027,14 +2033,16 @@ class PagedSpace : public Space {
// the free list or accounted as waste.
// If add_to_freelist is false then just accounting stats are updated and
// no attempt to add area to free list is made.
- int Free(Address start, int size_in_bytes) {
- int wasted = free_list_.Free(start, size_in_bytes, kLinkCategory);
+ size_t Free(Address start, size_t size_in_bytes) {
+ size_t wasted = free_list_.Free(start, size_in_bytes, kLinkCategory);
accounting_stats_.DeallocateBytes(size_in_bytes);
+ DCHECK_GE(size_in_bytes, wasted);
return size_in_bytes - wasted;
}
- int UnaccountedFree(Address start, int size_in_bytes) {
- int wasted = free_list_.Free(start, size_in_bytes, kDoNotLinkCategory);
+ size_t UnaccountedFree(Address start, size_t size_in_bytes) {
+ size_t wasted = free_list_.Free(start, size_in_bytes, kDoNotLinkCategory);
+ DCHECK_GE(size_in_bytes, wasted);
return size_in_bytes - wasted;
}
« no previous file with comments | « src/heap/mark-compact.cc ('k') | src/heap/spaces.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698