Chromium Code Reviews| 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 |