Index: src/spaces.cc |
diff --git a/src/spaces.cc b/src/spaces.cc |
index a80341bd7fc6baa7750e76c89528ba6cbbeb29fe..08b8531deb5fbd8c3183c25f170697e57bd7cace 100644 |
--- a/src/spaces.cc |
+++ b/src/spaces.cc |
@@ -560,21 +560,12 @@ bool MemoryChunk::CommitArea(size_t requested) { |
void MemoryChunk::InsertAfter(MemoryChunk* other) { |
- next_chunk_ = other->next_chunk_; |
- prev_chunk_ = other; |
+ MemoryChunk* other_next = other->next_chunk(); |
- // This memory barrier is needed since concurrent sweeper threads may iterate |
- // over the list of pages while a new page is inserted. |
- // TODO(hpayer): find a cleaner way to guarantee that the page list can be |
- // expanded concurrently |
- MemoryBarrier(); |
- |
- // The following two write operations can take effect in arbitrary order |
- // since pages are always iterated by the sweeper threads in LIFO order, i.e, |
- // the inserted page becomes visible for the sweeper threads after |
- // other->next_chunk_ = this; |
- other->next_chunk_->prev_chunk_ = this; |
- other->next_chunk_ = this; |
+ set_next_chunk(other_next); |
+ set_prev_chunk(other); |
+ other_next->set_prev_chunk(this); |
+ other->set_next_chunk(this); |
} |
@@ -583,10 +574,12 @@ void MemoryChunk::Unlink() { |
heap_->decrement_scan_on_scavenge_pages(); |
ClearFlag(SCAN_ON_SCAVENGE); |
} |
- next_chunk_->prev_chunk_ = prev_chunk_; |
- prev_chunk_->next_chunk_ = next_chunk_; |
- prev_chunk_ = NULL; |
- next_chunk_ = NULL; |
+ MemoryChunk* next_element = next_chunk(); |
+ MemoryChunk* prev_element = prev_chunk(); |
+ next_element->set_prev_chunk(prev_element); |
+ prev_element->set_next_chunk(next_element); |
+ set_prev_chunk(NULL); |
+ set_next_chunk(NULL); |
} |