| Index: runtime/vm/heap.cc
|
| diff --git a/runtime/vm/heap.cc b/runtime/vm/heap.cc
|
| index 1aa3a8e5c3abbe71fb1ffe7e37e52af05a67e834..ad1f24deadd339df802c63bc1e38e44f711af771 100644
|
| --- a/runtime/vm/heap.cc
|
| +++ b/runtime/vm/heap.cc
|
| @@ -57,72 +57,23 @@ Heap::~Heap() {
|
| }
|
| }
|
|
|
| -void Heap::FillRemainingTLAB(Thread* thread) {
|
| - uword start = thread->top();
|
| - uword end = thread->end();
|
| - ASSERT(end >= start);
|
| - intptr_t size = end - start;
|
| - ASSERT(Utils::IsAligned(size, kObjectAlignment));
|
| - if (size >= kObjectAlignment) {
|
| - FreeListElement::AsElement(start, size);
|
| - ASSERT(RawObject::FromAddr(start)->Size() == size);
|
| - ASSERT((start + size) == new_space_.top());
|
| - }
|
| -}
|
| -
|
| -void Heap::AbandonRemainingTLAB(Thread* thread) {
|
| - FillRemainingTLAB(thread);
|
| - thread->set_top(0);
|
| - thread->set_end(0);
|
| -}
|
| -
|
| -intptr_t Heap::CalculateTLABSize() {
|
| - intptr_t size = new_space_.end() - new_space_.top();
|
| - return Utils::RoundDown(size, kObjectAlignment);
|
| -}
|
| -
|
| uword Heap::AllocateNew(intptr_t size) {
|
| ASSERT(Thread::Current()->no_safepoint_scope_depth() == 0);
|
| // Currently, only the Dart thread may allocate in new space.
|
| isolate()->AssertCurrentThreadIsMutator();
|
| Thread* thread = Thread::Current();
|
| uword addr = new_space_.TryAllocateInTLAB(thread, size);
|
| - if (addr != 0) {
|
| - return addr;
|
| - }
|
| -
|
| - intptr_t tlab_size = CalculateTLABSize();
|
| - if ((tlab_size > 0) && (size > tlab_size)) {
|
| - return AllocateOld(size, HeapPage::kData);
|
| - }
|
| -
|
| - AbandonRemainingTLAB(thread);
|
| - if (tlab_size > 0) {
|
| - uword tlab_top = new_space_.TryAllocateNewTLAB(thread, tlab_size);
|
| - if (tlab_top != 0) {
|
| - addr = new_space_.TryAllocateInTLAB(thread, size);
|
| - ASSERT(addr != 0);
|
| - return addr;
|
| - }
|
| - }
|
| -
|
| - ASSERT(!thread->HasActiveTLAB());
|
| -
|
| - // This call to CollectGarbage might end up "reusing" a collection spawned
|
| - // from a different thread and will be racing to allocate the requested
|
| - // memory with other threads being released after the collection.
|
| - CollectGarbage(kNew);
|
| - tlab_size = CalculateTLABSize();
|
| - uword tlab_top = new_space_.TryAllocateNewTLAB(thread, tlab_size);
|
| - if (tlab_top != 0) {
|
| + if (addr == 0) {
|
| + // This call to CollectGarbage might end up "reusing" a collection spawned
|
| + // from a different thread and will be racing to allocate the requested
|
| + // memory with other threads being released after the collection.
|
| + CollectGarbage(kNew);
|
| addr = new_space_.TryAllocateInTLAB(thread, size);
|
| - // It is possible a GC doesn't clear enough space.
|
| - // In that case, we must fall through and allocate into old space.
|
| - if (addr != 0) {
|
| - return addr;
|
| + if (addr == 0) {
|
| + return AllocateOld(size, HeapPage::kData);
|
| }
|
| }
|
| - return AllocateOld(size, HeapPage::kData);
|
| + return addr;
|
| }
|
|
|
| uword Heap::AllocateOld(intptr_t size, HeapPage::PageType type) {
|
| @@ -604,14 +555,13 @@ bool Heap::VerifyGC(MarkExpectation mark_expectation) const {
|
| StackZone stack_zone(Thread::Current());
|
|
|
| // Change the new space's top_ with the more up-to-date thread's view of top_
|
| - uword saved_top = new_space_.FlushTLS();
|
| + new_space_.FlushTLS();
|
|
|
| ObjectSet* allocated_set =
|
| CreateAllocatedObjectSet(stack_zone.GetZone(), mark_expectation);
|
| VerifyPointersVisitor visitor(isolate(), allocated_set);
|
| VisitObjectPointers(&visitor);
|
|
|
| - new_space_.UnflushTLS(saved_top);
|
| // Only returning a value so that Heap::Validate can be called from an ASSERT.
|
| return true;
|
| }
|
|
|