Chromium Code Reviews

Side by Side Diff: third_party/WebKit/Source/platform/heap/Heap.h

Issue 2019273002: Make reallocation of large objects reliable. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff |
« no previous file with comments | « no previous file | third_party/WebKit/Source/platform/heap/HeapPage.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2013 Google Inc. All rights reserved. 2 * Copyright (C) 2013 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 556 matching lines...)
567 // TODO(sof): promptly free the previous object. 567 // TODO(sof): promptly free the previous object.
568 if (!size) { 568 if (!size) {
569 // If the new size is 0 this is considered equivalent to free(previous). 569 // If the new size is 0 this is considered equivalent to free(previous).
570 return nullptr; 570 return nullptr;
571 } 571 }
572 572
573 ThreadState* state = ThreadStateFor<ThreadingTrait<T>::Affinity>::state(); 573 ThreadState* state = ThreadStateFor<ThreadingTrait<T>::Affinity>::state();
574 HeapObjectHeader* previousHeader = HeapObjectHeader::fromPayload(previous); 574 HeapObjectHeader* previousHeader = HeapObjectHeader::fromPayload(previous);
575 BasePage* page = pageFromObject(previousHeader); 575 BasePage* page = pageFromObject(previousHeader);
576 ASSERT(page); 576 ASSERT(page);
577 int arenaIndex = page->arena()->arenaIndex();
578 // Recompute the effective heap index if previous allocation
579 // was on the normal arenas or a large object.
580 if (isNormalArenaIndex(arenaIndex) || arenaIndex == BlinkGC::LargeObjectAren aIndex)
581 arenaIndex = arenaIndexForObjectSize(size);
582 577
578 // Determine arena index of new allocation.
579 int arenaIndex;
580 if (size >= largeObjectSizeThreshold) {
581 arenaIndex = BlinkGC::LargeObjectArenaIndex;
582 } else {
583 arenaIndex = page->arena()->arenaIndex();
584 if (isNormalArenaIndex(arenaIndex) || arenaIndex == BlinkGC::LargeObject ArenaIndex)
585 arenaIndex = arenaIndexForObjectSize(size);
586 }
587
588 size_t gcInfoIndex = GCInfoTrait<T>::index();
583 // TODO(haraken): We don't support reallocate() for finalizable objects. 589 // TODO(haraken): We don't support reallocate() for finalizable objects.
584 ASSERT(!ThreadHeap::gcInfo(previousHeader->gcInfoIndex())->hasFinalizer()); 590 ASSERT(!ThreadHeap::gcInfo(previousHeader->gcInfoIndex())->hasFinalizer());
585 ASSERT(previousHeader->gcInfoIndex() == GCInfoTrait<T>::index()); 591 ASSERT(previousHeader->gcInfoIndex() == gcInfoIndex);
586 const char* typeName = WTF_HEAP_PROFILER_TYPE_NAME(T);
587 HeapAllocHooks::freeHookIfEnabled(static_cast<Address>(previous)); 592 HeapAllocHooks::freeHookIfEnabled(static_cast<Address>(previous));
588 Address address = ThreadHeap::allocateOnArenaIndex(state, size, arenaIndex, GCInfoTrait<T>::index(), typeName); 593 Address address;
594 if (arenaIndex == BlinkGC::LargeObjectArenaIndex) {
595 address = page->arena()->allocateLargeObject(allocationSizeFromSize(size ), gcInfoIndex);
596 } else {
597 const char* typeName = WTF_HEAP_PROFILER_TYPE_NAME(T);
598 address = ThreadHeap::allocateOnArenaIndex(state, size, arenaIndex, gcIn foIndex, typeName);
599 }
589 size_t copySize = previousHeader->payloadSize(); 600 size_t copySize = previousHeader->payloadSize();
590 if (copySize > size) 601 if (copySize > size)
591 copySize = size; 602 copySize = size;
592 memcpy(address, previous, copySize); 603 memcpy(address, previous, copySize);
593 return address; 604 return address;
594 } 605 }
595 606
596 template<typename Derived> 607 template<typename Derived>
597 template<typename T> 608 template<typename T>
598 void VisitorHelper<Derived>::handleWeakCell(Visitor* self, void* object) 609 void VisitorHelper<Derived>::handleWeakCell(Visitor* self, void* object)
599 { 610 {
600 T** cell = reinterpret_cast<T**>(object); 611 T** cell = reinterpret_cast<T**>(object);
601 if (*cell && !ObjectAliveTrait<T>::isHeapObjectAlive(*cell)) 612 if (*cell && !ObjectAliveTrait<T>::isHeapObjectAlive(*cell))
602 *cell = nullptr; 613 *cell = nullptr;
603 } 614 }
604 615
605 } // namespace blink 616 } // namespace blink
606 617
607 #endif // Heap_h 618 #endif // Heap_h
OLDNEW
« no previous file with comments | « no previous file | third_party/WebKit/Source/platform/heap/HeapPage.h » ('j') | no next file with comments »

Powered by Google App Engine