Chromium Code Reviews| Index: runtime/vm/pages.cc |
| =================================================================== |
| --- runtime/vm/pages.cc (revision 39806) |
| +++ runtime/vm/pages.cc (working copy) |
| @@ -770,17 +770,22 @@ |
| } |
| -uword PageSpace::TryAllocateDataBump(intptr_t size, |
| - GrowthPolicy growth_policy) { |
| +template<bool is_locked> |
|
Ivan Posva
2014/09/04 21:50:47
Please use a real parameter instead.
koda
2014/09/05 00:24:53
Done.
|
| +uword PageSpace::TryAllocateDataBumpInternal(intptr_t size, |
| + GrowthPolicy growth_policy) { |
| ASSERT(size >= kObjectAlignment); |
| ASSERT(Utils::IsAligned(size, kObjectAlignment)); |
| intptr_t remaining = bump_end_ - bump_top_; |
| if (remaining < size) { |
| // Checking this first would be logical, but needlessly slow. |
| if (size >= kAllocatablePageSize) { |
| - return TryAllocate(size, HeapPage::kData, growth_policy); |
| + return is_locked ? |
| + TryAllocateDataLocked(size, growth_policy) : |
| + TryAllocate(size, HeapPage::kData, growth_policy); |
| } |
| - FreeListElement* block = freelist_[HeapPage::kData].TryAllocateLarge(size); |
| + FreeListElement* block = is_locked ? |
| + freelist_[HeapPage::kData].TryAllocateLargeLocked(size) : |
| + freelist_[HeapPage::kData].TryAllocateLarge(size); |
| if (block == NULL) { |
| // Allocating from a new page (if growth policy allows) will have the |
| // side-effect of populating the freelist with a large block. The next |
| @@ -789,9 +794,16 @@ |
| return TryAllocateInFreshPage(size, |
| HeapPage::kData, |
| growth_policy, |
| - /* is_locked = */ false); |
| + is_locked); |
| } |
| intptr_t block_size = block->Size(); |
| + if (remaining > 0) { |
| + if (is_locked) { |
| + freelist_[HeapPage::kData].FreeLocked(bump_top_, remaining); |
| + } else { |
| + freelist_[HeapPage::kData].Free(bump_top_, remaining); |
| + } |
| + } |
| bump_top_ = reinterpret_cast<uword>(block); |
| bump_end_ = bump_top_ + block_size; |
| remaining = block_size; |
| @@ -808,6 +820,34 @@ |
| } |
| +uword PageSpace::TryAllocateDataBump(intptr_t size, |
| + GrowthPolicy growth_policy) { |
| + return TryAllocateDataBumpInternal<false>(size, growth_policy); |
| +} |
| + |
| + |
| +uword PageSpace::TryAllocateDataBumpLocked(intptr_t size, |
| + GrowthPolicy growth_policy) { |
| + return TryAllocateDataBumpInternal<true>(size, growth_policy); |
| +} |
| + |
| + |
| +uword PageSpace::TryAllocatePromo(intptr_t size, GrowthPolicy growth_policy) { |
|
Ivan Posva
2014/09/04 21:50:47
TryAllocatePromoLocked
koda
2014/09/05 00:24:52
Done.
|
| + FreeList* freelist = &freelist_[HeapPage::kData]; |
| + uword result; |
| + if (size <= freelist->SmallSizeBound()) { |
|
Ivan Posva
2014/09/04 21:50:47
Please roll these into a single API.
koda
2014/09/05 00:24:52
Done.
|
| + result = freelist->TryAllocateSmall(size); |
| + if (result != 0) { |
| + usage_.used_in_words += size >> kWordSizeLog2; |
| + return result; |
| + } |
| + } |
| + result = TryAllocateDataBumpLocked(size, growth_policy); |
| + if (result != 0) return result; |
| + return TryAllocateDataLocked(size, growth_policy); |
| +} |
| + |
| + |
| PageSpaceController::PageSpaceController(Heap* heap, |
| int heap_growth_ratio, |
| int heap_growth_max, |