Commit 81347246 authored by hpayer@chromium.org's avatar hpayer@chromium.org

Make prev and next pointer in pages list AtomicWords and access them using...

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

BUG=
R=jarin@chromium.org

Review URL: https://codereview.chromium.org/150413009

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@19332 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 75432b76
......@@ -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);
}
......
......@@ -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) {
Release_Store(&next_chunk_, reinterpret_cast<AtomicWord>(next));
}
void set_next_chunk(MemoryChunk* next) { next_chunk_ = next; }
void set_prev_chunk(MemoryChunk* prev) { prev_chunk_ = prev; }
void set_prev_chunk(MemoryChunk* prev) {
Release_Store(&prev_chunk_, reinterpret_cast<AtomicWord>(prev));
}
Space* owner() const {
if ((reinterpret_cast<intptr_t>(owner_) & kFailureTagMask) ==
......@@ -536,7 +546,7 @@ class MemoryChunk {
static const intptr_t kAlignmentMask = kAlignment - 1;
static const intptr_t kSizeOffset = kPointerSize + kPointerSize;
static const intptr_t kSizeOffset = 0;
static const intptr_t kLiveBytesOffset =
kSizeOffset + kPointerSize + kPointerSize + kPointerSize +
......@@ -550,7 +560,8 @@ class MemoryChunk {
static const size_t kHeaderSize = kWriteBarrierCounterOffset + kPointerSize +
kIntSize + kIntSize + kPointerSize +
5 * kPointerSize;
5 * kPointerSize +
kPointerSize + kPointerSize;
static const int kBodyOffset =
CODE_POINTER_ALIGN(kHeaderSize + Bitmap::kSize);
......@@ -622,7 +633,7 @@ class MemoryChunk {
inline Heap* heap() { return heap_; }
static const int kFlagsOffset = kPointerSize * 3;
static const int kFlagsOffset = kPointerSize;
bool IsEvacuationCandidate() { return IsFlagSet(EVACUATION_CANDIDATE); }
......@@ -671,8 +682,6 @@ class MemoryChunk {
static inline void UpdateHighWaterMark(Address mark);
protected:
MemoryChunk* next_chunk_;
MemoryChunk* prev_chunk_;
size_t size_;
intptr_t flags_;
......@@ -719,6 +728,12 @@ class MemoryChunk {
Executability executable,
Space* owner);
private:
// next_chunk_ holds a pointer of type MemoryChunk
AtomicWord next_chunk_;
// prev_chunk_ holds a pointer of type MemoryChunk
AtomicWord prev_chunk_;
friend class MemoryAllocator;
};
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment