Index: src/store-buffer.cc |
=================================================================== |
--- src/store-buffer.cc (revision 10131) |
+++ src/store-buffer.cc (working copy) |
@@ -41,6 +41,7 @@ |
old_start_(NULL), |
old_limit_(NULL), |
old_top_(NULL), |
+ old_reserved_limit_(NULL), |
old_buffer_is_sorted_(false), |
old_buffer_is_filtered_(false), |
during_gc_(false), |
@@ -59,11 +60,28 @@ |
reinterpret_cast<uintptr_t>(virtual_memory_->address()); |
start_ = |
reinterpret_cast<Address*>(RoundUp(start_as_int, kStoreBufferSize * 2)); |
- limit_ = start_ + (kStoreBufferSize / sizeof(*start_)); |
+ limit_ = start_ + (kStoreBufferSize / kPointerSize); |
- old_top_ = old_start_ = new Address[kOldStoreBufferLength]; |
- old_limit_ = old_start_ + kOldStoreBufferLength; |
+ old_virtual_memory_ = |
+ new 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 |
+ // less than 0xfff. |
+ ASSERT((reinterpret_cast<uintptr_t>(old_start_) & 0xfff) == 0); |
+ int initial_length = kInitialOldStoreBufferLength; |
+ if (initial_length == 0) initial_length = 1; |
Michael Starzinger
2011/12/02 13:38:52
Can we change this into ASSERT(initial_length != 0
Erik Corry
2011/12/02 14:07:27
Refactored in a slightly different way.
|
+ while (initial_length * kPointerSize < OS::CommitPageSize()) { |
+ initial_length *= 2; |
+ } |
+ old_limit_ = old_start_ + initial_length; |
+ old_reserved_limit_ = old_start_ + kOldStoreBufferLength; |
+ CHECK(old_virtual_memory_->Commit( |
+ reinterpret_cast<void*>(old_start_), |
+ (old_limit_ - old_start_) * kPointerSize, |
+ false)); |
+ |
ASSERT(reinterpret_cast<Address>(start_) >= virtual_memory_->address()); |
ASSERT(reinterpret_cast<Address>(limit_) >= virtual_memory_->address()); |
Address* vm_limit = reinterpret_cast<Address*>( |
@@ -76,9 +94,9 @@ |
ASSERT((reinterpret_cast<uintptr_t>(limit_ - 1) & kStoreBufferOverflowBit) == |
0); |
- virtual_memory_->Commit(reinterpret_cast<Address>(start_), |
- kStoreBufferSize, |
- false); // Not executable. |
+ CHECK(virtual_memory_->Commit(reinterpret_cast<Address>(start_), |
+ kStoreBufferSize, |
+ false)); // Not executable. |
heap_->public_set_store_buffer_top(start_); |
hash_map_1_ = new uintptr_t[kHashMapLength]; |
@@ -90,10 +108,10 @@ |
void StoreBuffer::TearDown() { |
delete virtual_memory_; |
+ delete old_virtual_memory_; |
delete[] hash_map_1_; |
delete[] hash_map_2_; |
- delete[] old_start_; |
- old_start_ = old_top_ = old_limit_ = NULL; |
+ old_start_ = old_top_ = old_limit_ = old_reserved_limit_ = NULL; |
start_ = limit_ = NULL; |
heap_->public_set_store_buffer_top(start_); |
} |
@@ -150,7 +168,17 @@ |
} |
-void StoreBuffer::HandleFullness() { |
+void StoreBuffer::EnsureSpace(intptr_t space_needed) { |
+ while (old_limit_ - old_top_ < space_needed && |
+ 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, false)); |
Michael Starzinger
2011/12/02 13:38:52
Can we put each argument on a separate line like w
Erik Corry
2011/12/02 14:07:27
Done.
|
+ old_limit_ += grow; |
+ } |
+ |
+ if (old_limit_ - old_top_ >= space_needed) return; |
+ |
if (old_buffer_is_filtered_) return; |
ASSERT(may_move_store_buffer_entries_); |
Compact(); |
@@ -645,9 +673,7 @@ |
// the worst case (compaction doesn't eliminate any pointers). |
ASSERT(top <= limit_); |
heap_->public_set_store_buffer_top(start_); |
- if (top - start_ > old_limit_ - old_top_) { |
- HandleFullness(); |
- } |
+ EnsureSpace(top - start_); |
ASSERT(may_move_store_buffer_entries_); |
// Goes through the addresses in the store buffer attempting to remove |
// duplicates. In the interest of speed this is a lossy operation. Some |
@@ -688,9 +714,7 @@ |
void StoreBuffer::CheckForFullBuffer() { |
- if (old_limit_ - old_top_ < kStoreBufferSize * 2) { |
- HandleFullness(); |
- } |
+ EnsureSpace(kStoreBufferSize * 2); |
} |
} } // namespace v8::internal |