Reviewers: jarin,

Description:
Make prev and next pointer in pages list AtomicWords and access them using
acquire/release semantics.

BUG=

Please review this at https://codereview.chromium.org/150413009/

SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge

Affected files (+27, -24 lines):
  M src/spaces.h
  M src/spaces.cc


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


Index: src/spaces.h
diff --git a/src/spaces.h b/src/spaces.h
index 9d47f81ac63dbbf65d357769c02f6307bf6ff15f..99ea080fc4dd73b52c1b63af776ea4d4a5dad339 100644
--- a/src/spaces.h
+++ b/src/spaces.h
@@ -313,11 +313,21 @@ class MemoryChunk {

   bool is_valid() { return address() != NULL; }

-  MemoryChunk* next_chunk() const { return next_chunk_; }
-  MemoryChunk* prev_chunk() const { return prev_chunk_; }
+  MemoryChunk* next_chunk() const {
+    return reinterpret_cast<MemoryChunk*>(Acquire_Load(&next_chunk_));
+  }
+
+  MemoryChunk* prev_chunk() const {
+    return reinterpret_cast<MemoryChunk*>(Acquire_Load(&prev_chunk_));
+  }

-  void set_next_chunk(MemoryChunk* next) { next_chunk_ = next; }
-  void set_prev_chunk(MemoryChunk* prev) { prev_chunk_ = prev; }
+  void set_next_chunk(MemoryChunk* next) {
+    Release_Store(&next_chunk_, reinterpret_cast<AtomicWord>(next));
+  }
+
+  void set_prev_chunk(MemoryChunk* prev) {
+    Release_Store(&prev_chunk_, reinterpret_cast<AtomicWord>(prev));
+  }

   Space* owner() const {
     if ((reinterpret_cast<intptr_t>(owner_) & kFailureTagMask) ==
@@ -671,8 +681,8 @@ class MemoryChunk {
   static inline void UpdateHighWaterMark(Address mark);

  protected:
-  MemoryChunk* next_chunk_;
-  MemoryChunk* prev_chunk_;
+  AtomicWord next_chunk_;
+  AtomicWord prev_chunk_;
   size_t size_;
   intptr_t flags_;



--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to