OLD | NEW |
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 587 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
598 } | 598 } |
599 if (header->isFree()) { | 599 if (header->isFree()) { |
600 // Zero the memory in the free list header to maintain the | 600 // Zero the memory in the free list header to maintain the |
601 // invariant that memory on the free list is zero filled. | 601 // invariant that memory on the free list is zero filled. |
602 // The rest of the memory is already on the free list and is | 602 // The rest of the memory is already on the free list and is |
603 // therefore already zero filled. | 603 // therefore already zero filled. |
604 FILL_ZERO_IF_PRODUCTION(headerAddress, size < sizeof(FreeListEnt
ry) ? size : sizeof(FreeListEntry)); | 604 FILL_ZERO_IF_PRODUCTION(headerAddress, size < sizeof(FreeListEnt
ry) ? size : sizeof(FreeListEntry)); |
605 headerAddress += size; | 605 headerAddress += size; |
606 continue; | 606 continue; |
607 } | 607 } |
| 608 header->checkHeader(); |
608 if (startOfGap != headerAddress) | 609 if (startOfGap != headerAddress) |
609 addToFreeList(startOfGap, headerAddress - startOfGap); | 610 addToFreeList(startOfGap, headerAddress - startOfGap); |
610 | 611 |
611 headerAddress += size; | 612 headerAddress += size; |
612 startOfGap = headerAddress; | 613 startOfGap = headerAddress; |
613 } | 614 } |
614 | 615 |
615 if (startOfGap != page->payloadEnd()) | 616 if (startOfGap != page->payloadEnd()) |
616 addToFreeList(startOfGap, page->payloadEnd() - startOfGap); | 617 addToFreeList(startOfGap, page->payloadEnd() - startOfGap); |
617 } | 618 } |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
651 } | 652 } |
652 | 653 |
653 m_promptlyFreedSize += size; | 654 m_promptlyFreedSize += size; |
654 } | 655 } |
655 | 656 |
656 bool NormalPageHeap::expandObject(HeapObjectHeader* header, size_t newSize) | 657 bool NormalPageHeap::expandObject(HeapObjectHeader* header, size_t newSize) |
657 { | 658 { |
658 // It's possible that Vector requests a smaller expanded size because | 659 // It's possible that Vector requests a smaller expanded size because |
659 // Vector::shrinkCapacity can set a capacity smaller than the actual payload | 660 // Vector::shrinkCapacity can set a capacity smaller than the actual payload |
660 // size. | 661 // size. |
| 662 header->checkHeader(); |
661 if (header->payloadSize() >= newSize) | 663 if (header->payloadSize() >= newSize) |
662 return true; | 664 return true; |
663 size_t allocationSize = Heap::allocationSizeFromSize(newSize); | 665 size_t allocationSize = Heap::allocationSizeFromSize(newSize); |
664 ASSERT(allocationSize > header->size()); | 666 ASSERT(allocationSize > header->size()); |
665 size_t expandSize = allocationSize - header->size(); | 667 size_t expandSize = allocationSize - header->size(); |
666 if (header->payloadEnd() == m_currentAllocationPoint && expandSize <= m_rema
iningAllocationSize) { | 668 if (header->payloadEnd() == m_currentAllocationPoint && expandSize <= m_rema
iningAllocationSize) { |
667 m_currentAllocationPoint += expandSize; | 669 m_currentAllocationPoint += expandSize; |
668 m_remainingAllocationSize -= expandSize; | 670 m_remainingAllocationSize -= expandSize; |
669 | 671 |
670 // Unpoison the memory used for the object (payload). | 672 // Unpoison the memory used for the object (payload). |
671 ASAN_UNPOISON_MEMORY_REGION(header->payloadEnd(), expandSize); | 673 ASAN_UNPOISON_MEMORY_REGION(header->payloadEnd(), expandSize); |
672 FILL_ZERO_IF_NOT_PRODUCTION(header->payloadEnd(), expandSize); | 674 FILL_ZERO_IF_NOT_PRODUCTION(header->payloadEnd(), expandSize); |
673 header->setSize(allocationSize); | 675 header->setSize(allocationSize); |
674 ASSERT(findPageFromAddress(header->payloadEnd() - 1)); | 676 ASSERT(findPageFromAddress(header->payloadEnd() - 1)); |
675 return true; | 677 return true; |
676 } | 678 } |
677 return false; | 679 return false; |
678 } | 680 } |
679 | 681 |
680 bool NormalPageHeap::shrinkObject(HeapObjectHeader* header, size_t newSize) | 682 bool NormalPageHeap::shrinkObject(HeapObjectHeader* header, size_t newSize) |
681 { | 683 { |
| 684 header->checkHeader(); |
682 ASSERT(header->payloadSize() > newSize); | 685 ASSERT(header->payloadSize() > newSize); |
683 size_t allocationSize = Heap::allocationSizeFromSize(newSize); | 686 size_t allocationSize = Heap::allocationSizeFromSize(newSize); |
684 ASSERT(header->size() > allocationSize); | 687 ASSERT(header->size() > allocationSize); |
685 size_t shrinkSize = header->size() - allocationSize; | 688 size_t shrinkSize = header->size() - allocationSize; |
686 if (header->payloadEnd() == m_currentAllocationPoint) { | 689 if (header->payloadEnd() == m_currentAllocationPoint) { |
687 m_currentAllocationPoint -= shrinkSize; | 690 m_currentAllocationPoint -= shrinkSize; |
688 m_remainingAllocationSize += shrinkSize; | 691 m_remainingAllocationSize += shrinkSize; |
689 FILL_ZERO_IF_PRODUCTION(m_currentAllocationPoint, shrinkSize); | 692 FILL_ZERO_IF_PRODUCTION(m_currentAllocationPoint, shrinkSize); |
690 ASAN_POISON_MEMORY_REGION(m_currentAllocationPoint, shrinkSize); | 693 ASAN_POISON_MEMORY_REGION(m_currentAllocationPoint, shrinkSize); |
691 header->setSize(allocationSize); | 694 header->setSize(allocationSize); |
(...skipping 581 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1273 for (size_t i = 0; i < objectSize / sizeof(Address); ++i) { | 1276 for (size_t i = 0; i < objectSize / sizeof(Address); ++i) { |
1274 if (objectFields[i] != 0) | 1277 if (objectFields[i] != 0) |
1275 return false; | 1278 return false; |
1276 } | 1279 } |
1277 return true; | 1280 return true; |
1278 } | 1281 } |
1279 #endif | 1282 #endif |
1280 | 1283 |
1281 static void markPointer(Visitor* visitor, HeapObjectHeader* header) | 1284 static void markPointer(Visitor* visitor, HeapObjectHeader* header) |
1282 { | 1285 { |
| 1286 header->checkHeader(); |
1283 const GCInfo* gcInfo = Heap::gcInfo(header->gcInfoIndex()); | 1287 const GCInfo* gcInfo = Heap::gcInfo(header->gcInfoIndex()); |
1284 if (gcInfo->hasVTable() && !vTableInitialized(header->payload())) { | 1288 if (gcInfo->hasVTable() && !vTableInitialized(header->payload())) { |
1285 // We hit this branch when a GC strikes before GarbageCollected<>'s | 1289 // We hit this branch when a GC strikes before GarbageCollected<>'s |
1286 // constructor runs. | 1290 // constructor runs. |
1287 // | 1291 // |
1288 // class A : public GarbageCollected<A> { virtual void f() = 0; }; | 1292 // class A : public GarbageCollected<A> { virtual void f() = 0; }; |
1289 // class B : public A { | 1293 // class B : public A { |
1290 // B() : A(foo()) { }; | 1294 // B() : A(foo()) { }; |
1291 // }; | 1295 // }; |
1292 // | 1296 // |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1344 { | 1348 { |
1345 HeapObjectHeader* header = nullptr; | 1349 HeapObjectHeader* header = nullptr; |
1346 for (Address addr = payload(); addr < payloadEnd(); addr += header->size())
{ | 1350 for (Address addr = payload(); addr < payloadEnd(); addr += header->size())
{ |
1347 header = reinterpret_cast<HeapObjectHeader*>(addr); | 1351 header = reinterpret_cast<HeapObjectHeader*>(addr); |
1348 if (json) | 1352 if (json) |
1349 json->pushInteger(header->encodedSize()); | 1353 json->pushInteger(header->encodedSize()); |
1350 if (header->isFree()) { | 1354 if (header->isFree()) { |
1351 info->freeSize += header->size(); | 1355 info->freeSize += header->size(); |
1352 continue; | 1356 continue; |
1353 } | 1357 } |
| 1358 header->checkHeader(); |
1354 | 1359 |
1355 size_t tag = info->getClassTag(Heap::gcInfo(header->gcInfoIndex())); | 1360 size_t tag = info->getClassTag(Heap::gcInfo(header->gcInfoIndex())); |
1356 size_t age = header->age(); | 1361 size_t age = header->age(); |
1357 if (json) | 1362 if (json) |
1358 json->pushInteger(tag); | 1363 json->pushInteger(tag); |
1359 if (header->isMarked()) { | 1364 if (header->isMarked()) { |
1360 info->liveCount[tag] += 1; | 1365 info->liveCount[tag] += 1; |
1361 info->liveSize[tag] += header->size(); | 1366 info->liveSize[tag] += header->size(); |
1362 // Count objects that are live when promoted to the final generation
. | 1367 // Count objects that are live when promoted to the final generation
. |
1363 if (age == maxHeapObjectAge - 1) | 1368 if (age == maxHeapObjectAge - 1) |
(...skipping 862 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2226 size_t Heap::s_allocatedObjectSize = 0; | 2231 size_t Heap::s_allocatedObjectSize = 0; |
2227 size_t Heap::s_allocatedSpace = 0; | 2232 size_t Heap::s_allocatedSpace = 0; |
2228 size_t Heap::s_markedObjectSize = 0; | 2233 size_t Heap::s_markedObjectSize = 0; |
2229 // We don't want to use 0 KB for the initial value because it may end up | 2234 // We don't want to use 0 KB for the initial value because it may end up |
2230 // triggering the first GC of some thread too prematurely. | 2235 // triggering the first GC of some thread too prematurely. |
2231 size_t Heap::s_estimatedLiveObjectSize = 512 * 1024; | 2236 size_t Heap::s_estimatedLiveObjectSize = 512 * 1024; |
2232 size_t Heap::s_externalObjectSizeAtLastGC = 0; | 2237 size_t Heap::s_externalObjectSizeAtLastGC = 0; |
2233 double Heap::s_estimatedMarkingTimePerByte = 0.0; | 2238 double Heap::s_estimatedMarkingTimePerByte = 0.0; |
2234 | 2239 |
2235 } // namespace blink | 2240 } // namespace blink |
OLD | NEW |