Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1098)

Unified Diff: src/store-buffer.cc

Issue 387483002: Revert "Precisely sweeping of scan-on-scavenge pages." (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/store-buffer.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/store-buffer.cc
diff --git a/src/store-buffer.cc b/src/store-buffer.cc
index a9e135647f689aecfbd9350d6b2afe5d592ee8b5..3745d91a8a417071b8f40262069ebee34deed332 100644
--- a/src/store-buffer.cc
+++ b/src/store-buffer.cc
@@ -11,7 +11,6 @@
#include "src/base/atomicops.h"
#include "src/counters.h"
#include "src/store-buffer-inl.h"
-#include "src/utils.h"
namespace v8 {
namespace internal {
@@ -23,13 +22,10 @@ StoreBuffer::StoreBuffer(Heap* heap)
old_start_(NULL),
old_limit_(NULL),
old_top_(NULL),
- old_regular_limit_(NULL),
old_reserved_limit_(NULL),
- old_virtual_memory_(NULL),
- old_store_buffer_length_(0),
old_buffer_is_sorted_(false),
old_buffer_is_filtered_(false),
- allow_overflow_(false),
+ during_gc_(false),
store_buffer_rebuilding_enabled_(false),
callback_(NULL),
may_move_store_buffer_entries_(true),
@@ -48,16 +44,8 @@ void StoreBuffer::SetUp() {
reinterpret_cast<Address*>(RoundUp(start_as_int, kStoreBufferSize * 2));
limit_ = start_ + (kStoreBufferSize / kPointerSize);
- // We set the maximum store buffer size to the maximum size of a semi-space.
- // The store buffer may reach this limit during a full garbage collection.
- // Note that half of the semi-space should be good enough since half of the
- // memory in the semi-space are not object pointers.
- old_store_buffer_length_ =
- Max(static_cast<int>(heap_->MaxSemiSpaceSize() / sizeof(Address)),
- kOldRegularStoreBufferLength);
-
old_virtual_memory_ =
- new base::VirtualMemory(old_store_buffer_length_ * kPointerSize);
+ new base::VirtualMemory(kOldStoreBufferLength * kPointerSize);
old_top_ = old_start_ =
reinterpret_cast<Address*>(old_virtual_memory_->address());
// Don't know the alignment requirements of the OS, but it is certainly not
@@ -66,12 +54,9 @@ void StoreBuffer::SetUp() {
int initial_length =
static_cast<int>(base::OS::CommitPageSize() / kPointerSize);
ASSERT(initial_length > 0);
- ASSERT(initial_length <= kOldRegularStoreBufferLength);
- ASSERT(initial_length <= old_store_buffer_length_);
- ASSERT(kOldRegularStoreBufferLength <= old_store_buffer_length_);
+ ASSERT(initial_length <= kOldStoreBufferLength);
old_limit_ = old_start_ + initial_length;
- old_regular_limit_ = old_start_ + kOldRegularStoreBufferLength;
- old_reserved_limit_ = old_start_ + old_store_buffer_length_;
+ old_reserved_limit_ = old_start_ + kOldStoreBufferLength;
CHECK(old_virtual_memory_->Commit(
reinterpret_cast<void*>(old_start_),
@@ -108,13 +93,8 @@ void StoreBuffer::TearDown() {
delete old_virtual_memory_;
delete[] hash_set_1_;
delete[] hash_set_2_;
- old_start_ = NULL;
- old_top_ = NULL;
- old_limit_ = NULL;
- old_reserved_limit_ = NULL;
- old_regular_limit_ = NULL;
- start_ = NULL;
- limit_ = NULL;
+ old_start_ = old_top_ = old_limit_ = old_reserved_limit_ = NULL;
+ start_ = limit_ = NULL;
heap_->public_set_store_buffer_top(start_);
}
@@ -148,35 +128,9 @@ bool StoreBuffer::SpaceAvailable(intptr_t space_needed) {
}
-template<StoreBuffer::ExemptPopularPagesMode mode>
-void StoreBuffer::IterativelyExemptPopularPages(intptr_t space_needed) {
- // Sample 1 entry in 97 and filter out the pages where we estimate that more
- // than 1 in 8 pointers are to new space.
- static const int kSampleFinenesses = 5;
- static const struct Samples {
- int prime_sample_step;
- int threshold;
- } samples[kSampleFinenesses] = {
- { 97, ((Page::kPageSize / kPointerSize) / 97) / 8 },
- { 23, ((Page::kPageSize / kPointerSize) / 23) / 16 },
- { 7, ((Page::kPageSize / kPointerSize) / 7) / 32 },
- { 3, ((Page::kPageSize / kPointerSize) / 3) / 256 },
- { 1, 0}
- };
- for (int i = 0; i < kSampleFinenesses; i++) {
- ExemptPopularPages(samples[i].prime_sample_step, samples[i].threshold);
- // As a last resort we mark all pages as being exempt from the store buffer.
- ASSERT(i != (kSampleFinenesses - 1) || old_top_ == old_start_);
- if (mode == ENSURE_SPACE && SpaceAvailable(space_needed)) return;
- else if (mode == SHRINK_TO_REGULAR_SIZE && old_top_ < old_limit_) return;
- }
-}
-
-
void StoreBuffer::EnsureSpace(intptr_t space_needed) {
while (old_limit_ - old_top_ < space_needed &&
- ((!allow_overflow_ && old_limit_ < old_regular_limit_) ||
- (allow_overflow_ && old_limit_ < old_reserved_limit_))) {
+ old_limit_ < old_reserved_limit_) {
size_t grow = old_limit_ - old_start_; // Double size.
CHECK(old_virtual_memory_->Commit(reinterpret_cast<void*>(old_limit_),
grow * kPointerSize,
@@ -208,8 +162,26 @@ void StoreBuffer::EnsureSpace(intptr_t space_needed) {
if (SpaceAvailable(space_needed)) return;
- IterativelyExemptPopularPages<ENSURE_SPACE>(space_needed);
- ASSERT(SpaceAvailable(space_needed));
+ // Sample 1 entry in 97 and filter out the pages where we estimate that more
+ // than 1 in 8 pointers are to new space.
+ static const int kSampleFinenesses = 5;
+ static const struct Samples {
+ int prime_sample_step;
+ int threshold;
+ } samples[kSampleFinenesses] = {
+ { 97, ((Page::kPageSize / kPointerSize) / 97) / 8 },
+ { 23, ((Page::kPageSize / kPointerSize) / 23) / 16 },
+ { 7, ((Page::kPageSize / kPointerSize) / 7) / 32 },
+ { 3, ((Page::kPageSize / kPointerSize) / 3) / 256 },
+ { 1, 0}
+ };
+ for (int i = 0; i < kSampleFinenesses; i++) {
+ ExemptPopularPages(samples[i].prime_sample_step, samples[i].threshold);
+ // As a last resort we mark all pages as being exempt from the store buffer.
+ ASSERT(i != (kSampleFinenesses - 1) || old_top_ == old_start_);
+ if (SpaceAvailable(space_needed)) return;
+ }
+ UNREACHABLE();
}
@@ -356,9 +328,9 @@ void StoreBuffer::ClearFilteringHashSets() {
}
-void StoreBuffer::GCPrologue(bool allow_overflow) {
+void StoreBuffer::GCPrologue() {
ClearFilteringHashSets();
- allow_overflow_ = allow_overflow;
+ during_gc_ = true;
}
@@ -394,13 +366,7 @@ void StoreBuffer::Verify() {
void StoreBuffer::GCEpilogue() {
- if (allow_overflow_ && old_limit_ > old_regular_limit_) {
- IterativelyExemptPopularPages<SHRINK_TO_REGULAR_SIZE>(0);
- ASSERT(old_limit_ < old_regular_limit_);
- old_virtual_memory_->Uncommit(old_limit_, old_regular_limit_ - old_limit_);
- }
-
- allow_overflow_ = false;
+ during_gc_ = false;
#ifdef VERIFY_HEAP
if (FLAG_verify_heap) {
Verify();
@@ -522,22 +488,25 @@ void StoreBuffer::IteratePointersToNewSpace(ObjectSlotCallback slot_callback,
FindPointersToNewSpaceInRegion(start, end, slot_callback, clear_maps);
} else {
Page* page = reinterpret_cast<Page*>(chunk);
- ASSERT(page->owner() == heap_->map_space() ||
- page->owner() == heap_->old_pointer_space());
- CHECK(!page->WasSweptConservatively());
-
- HeapObjectIterator iterator(page, NULL);
- for (HeapObject* heap_object = iterator.Next();
- heap_object != NULL;
- heap_object = iterator.Next()) {
- // We iterate over objects that contain pointers only.
- if (heap_object->ContainsPointers()) {
- FindPointersToNewSpaceInRegion(
- heap_object->address() + HeapObject::kHeaderSize,
- heap_object->address() + heap_object->Size(),
- slot_callback,
- clear_maps);
+ PagedSpace* owner = reinterpret_cast<PagedSpace*>(page->owner());
+ Address start = page->area_start();
+ Address end = page->area_end();
+ if (owner == heap_->map_space()) {
+ ASSERT(page->WasSweptPrecisely());
+ HeapObjectIterator iterator(page, NULL);
+ for (HeapObject* heap_object = iterator.Next(); heap_object != NULL;
+ heap_object = iterator.Next()) {
+ // We skip free space objects.
+ if (!heap_object->IsFiller()) {
+ FindPointersToNewSpaceInRegion(
+ heap_object->address() + HeapObject::kHeaderSize,
+ heap_object->address() + heap_object->Size(), slot_callback,
+ clear_maps);
+ }
}
+ } else {
+ FindPointersToNewSpaceInRegion(
+ start, end, slot_callback, clear_maps);
}
}
}
« no previous file with comments | « src/store-buffer.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698