| 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();
|
|
|