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

Unified Diff: src/heap/spaces.h

Issue 1377723003: [heap] Refactor and clean up FreeListCategory. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 3 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 | « no previous file | 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 c0837e4351b87c08fca9d811607d7d8d2ade6db5..038cb1cc17a0f3645de3392ed4d557258acdfd4e 100644
--- a/src/heap/spaces.h
+++ b/src/heap/spaces.h
@@ -752,6 +752,9 @@ class MemoryChunk {
};
+enum FreeListCategoryType { kSmall, kMedium, kLarge, kHuge };
Michael Lippautz 2015/10/01 12:06:59 This one will come in handy for programmatically s
+
+
// -----------------------------------------------------------------------------
// A page is a memory chunk of a size 1MB. Large object pages may be larger.
//
@@ -853,6 +856,25 @@ class Page : public MemoryChunk {
#undef FRAGMENTATION_STATS_ACCESSORS
+ void add_available_in_free_list(FreeListCategoryType type, intptr_t bytes) {
+ switch (type) {
+ case kSmall:
+ add_available_in_small_free_list(bytes);
+ break;
+ case kMedium:
+ add_available_in_medium_free_list(bytes);
+ break;
+ case kLarge:
+ add_available_in_large_free_list(bytes);
+ break;
+ case kHuge:
+ add_available_in_huge_free_list(bytes);
+ break;
+ default:
+ UNREACHABLE();
+ }
+ }
+
#ifdef DEBUG
void Print();
#endif // DEBUG
@@ -1518,8 +1540,12 @@ class AllocationStats BASE_EMBEDDED {
// the end element of the linked list of free memory blocks.
class FreeListCategory {
public:
- explicit FreeListCategory(FreeList* owner)
- : top_(0), end_(NULL), available_(0), owner_(owner) {}
+ explicit FreeListCategory(FreeList* owner, FreeListCategoryType type)
+ : type_(type),
+ top_(nullptr),
+ end_(nullptr),
+ available_(0),
+ owner_(owner) {}
intptr_t Concatenate(FreeListCategory* category);
@@ -1527,45 +1553,52 @@ class FreeListCategory {
void Free(FreeSpace* node, int size_in_bytes);
+ // Pick a node from the list.
FreeSpace* PickNodeFromList(int* node_size);
+
+ // Pick a node from the list and compare it against {size_in_bytes}. If the
+ // node's size is greater or equal return the node and null otherwise.
FreeSpace* PickNodeFromList(int size_in_bytes, int* node_size);
+ // Search for a node of size {size_in_bytes}.
+ FreeSpace* SearchForNodeInList(int size_in_bytes, int* node_size);
+
intptr_t EvictFreeListItemsInList(Page* p);
bool ContainsPageFreeListItemsInList(Page* p);
void RepairFreeList(Heap* heap);
- FreeSpace* top() const {
- return reinterpret_cast<FreeSpace*>(base::NoBarrier_Load(&top_));
- }
-
- void set_top(FreeSpace* top) {
- base::NoBarrier_Store(&top_, reinterpret_cast<base::AtomicWord>(top));
- }
-
- FreeSpace* end() const { return end_; }
- void set_end(FreeSpace* end) { end_ = end; }
+ bool IsEmpty() { return top() == nullptr; }
- int* GetAvailableAddress() { return &available_; }
+ FreeList* owner() { return owner_; }
int available() const { return available_; }
- void set_available(int available) { available_ = available; }
-
- bool IsEmpty() { return top() == 0; }
#ifdef DEBUG
intptr_t SumFreeList();
int FreeListLength();
#endif
- FreeList* owner() { return owner_; }
-
private:
- // top_ points to the top FreeSpace* in the free list category.
- base::AtomicWord top_;
+ FreeSpace* top() { return top_.Value(); }
+ void set_top(FreeSpace* top) { top_.SetValue(top); }
+
+ FreeSpace* end() const { return end_; }
+ void set_end(FreeSpace* end) { end_ = end; }
+
+ // |type_|: The type of this free list category.
+ FreeListCategoryType type_;
+
+ // |top_|: Points to the top FreeSpace* in the free list category.
+ AtomicValue<FreeSpace*> top_;
+
+ // |end_|: Points to the end FreeSpace* in the free list category.
FreeSpace* end_;
- // Total available bytes in all blocks of this free list category.
+
+ // |available_|: Total available bytes in all blocks of this free list
+ // category.
int available_;
+ // |owner_|: The owning free list of this category.
FreeList* owner_;
};
« no previous file with comments | « no previous file | src/heap/spaces.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698