Index: src/spaces.cc |
diff --git a/src/spaces.cc b/src/spaces.cc |
index 08b8531deb5fbd8c3183c25f170697e57bd7cace..aec51916bfe0f39c2b56fbf699f93cc780c5c3dc 100644 |
--- a/src/spaces.cc |
+++ b/src/spaces.cc |
@@ -2075,20 +2075,21 @@ void FreeListNode::set_next(FreeListNode* next) { |
intptr_t FreeListCategory::Concatenate(FreeListCategory* category) { |
intptr_t free_bytes = 0; |
- if (category->top_ != NULL) { |
- ASSERT(category->end_ != NULL); |
+ if (category->top() != NULL) { |
// This is safe (not going to deadlock) since Concatenate operations |
// are never performed on the same free lists at the same time in |
// reverse order. |
LockGuard<Mutex> target_lock_guard(mutex()); |
LockGuard<Mutex> source_lock_guard(category->mutex()); |
+ ASSERT(category->end_ != NULL); |
free_bytes = category->available(); |
if (end_ == NULL) { |
end_ = category->end(); |
} else { |
- category->end()->set_next(top_); |
+ category->end()->set_next(top()); |
} |
- top_ = category->top(); |
+ set_top(category->top()); |
+ NoBarrier_Store(&top_, category->top_); |
available_ += category->available(); |
category->Reset(); |
} |
@@ -2097,15 +2098,16 @@ intptr_t FreeListCategory::Concatenate(FreeListCategory* category) { |
void FreeListCategory::Reset() { |
- top_ = NULL; |
- end_ = NULL; |
- available_ = 0; |
+ set_top(NULL); |
+ set_end(NULL); |
+ set_available(0); |
} |
intptr_t FreeListCategory::EvictFreeListItemsInList(Page* p) { |
int sum = 0; |
- FreeListNode** n = &top_; |
+ FreeListNode* t = top(); |
+ FreeListNode** n = &t; |
while (*n != NULL) { |
if (Page::FromAddress((*n)->address()) == p) { |
FreeSpace* free_space = reinterpret_cast<FreeSpace*>(*n); |
@@ -2115,8 +2117,9 @@ intptr_t FreeListCategory::EvictFreeListItemsInList(Page* p) { |
n = (*n)->next_address(); |
} |
} |
- if (top_ == NULL) { |
- end_ = NULL; |
+ set_top(t); |
+ if (top() == NULL) { |
+ set_end(NULL); |
} |
available_ -= sum; |
return sum; |
@@ -2124,17 +2127,17 @@ intptr_t FreeListCategory::EvictFreeListItemsInList(Page* p) { |
bool FreeListCategory::ContainsPageFreeListItemsInList(Page* p) { |
- FreeListNode** n = &top_; |
- while (*n != NULL) { |
- if (Page::FromAddress((*n)->address()) == p) return true; |
- n = (*n)->next_address(); |
+ FreeListNode* node = top(); |
+ while (node != NULL) { |
+ if (Page::FromAddress(node->address()) == p) return true; |
+ node = node->next(); |
} |
return false; |
} |
FreeListNode* FreeListCategory::PickNodeFromList(int *node_size) { |
- FreeListNode* node = top_; |
+ FreeListNode* node = top(); |
if (node == NULL) return NULL; |
@@ -2173,8 +2176,8 @@ FreeListNode* FreeListCategory::PickNodeFromList(int size_in_bytes, |
void FreeListCategory::Free(FreeListNode* node, int size_in_bytes) { |
- node->set_next(top_); |
- top_ = node; |
+ node->set_next(top()); |
+ set_top(node); |
if (end_ == NULL) { |
end_ = node; |
} |
@@ -2183,7 +2186,7 @@ void FreeListCategory::Free(FreeListNode* node, int size_in_bytes) { |
void FreeListCategory::RepairFreeList(Heap* heap) { |
- FreeListNode* n = top_; |
+ FreeListNode* n = top(); |
while (n != NULL) { |
Map** map_location = reinterpret_cast<Map**>(n->address()); |
if (*map_location == NULL) { |
@@ -2292,7 +2295,8 @@ FreeListNode* FreeList::FindNodeFor(int size_in_bytes, int* node_size) { |
} |
int huge_list_available = huge_list_.available(); |
- for (FreeListNode** cur = huge_list_.GetTopAddress(); |
+ FreeListNode* top_node = huge_list_.top(); |
+ for (FreeListNode** cur = &top_node; |
*cur != NULL; |
cur = (*cur)->next_address()) { |
FreeListNode* cur_node = *cur; |
@@ -2326,6 +2330,7 @@ FreeListNode* FreeList::FindNodeFor(int size_in_bytes, int* node_size) { |
} |
} |
+ huge_list_.set_top(top_node); |
if (huge_list_.top() == NULL) { |
huge_list_.set_end(NULL); |
} |
@@ -2479,7 +2484,7 @@ void FreeList::RepairLists(Heap* heap) { |
#ifdef DEBUG |
intptr_t FreeListCategory::SumFreeList() { |
intptr_t sum = 0; |
- FreeListNode* cur = top_; |
+ FreeListNode* cur = top(); |
while (cur != NULL) { |
ASSERT(cur->map() == cur->GetHeap()->raw_unchecked_free_space_map()); |
FreeSpace* cur_as_free_space = reinterpret_cast<FreeSpace*>(cur); |
@@ -2495,7 +2500,7 @@ static const int kVeryLongFreeList = 500; |
int FreeListCategory::FreeListLength() { |
int length = 0; |
- FreeListNode* cur = top_; |
+ FreeListNode* cur = top(); |
while (cur != NULL) { |
length++; |
cur = cur->next(); |