Chromium Code Reviews| 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 687 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 698 public: | 698 public: |
| 699 FreeList(); | 699 FreeList(); |
| 700 | 700 |
| 701 void addToFreeList(Address, size_t); | 701 void addToFreeList(Address, size_t); |
| 702 void clear(); | 702 void clear(); |
| 703 | 703 |
| 704 // Returns a bucket number for inserting a FreeListEntry of a given size. | 704 // Returns a bucket number for inserting a FreeListEntry of a given size. |
| 705 // All FreeListEntries in the given bucket, n, have size >= 2^n. | 705 // All FreeListEntries in the given bucket, n, have size >= 2^n. |
| 706 static int bucketIndexForSize(size_t); | 706 static int bucketIndexForSize(size_t); |
| 707 | 707 |
| 708 #if ENABLE(GC_PROFILING) | |
| 709 void countBucketSizes(size_t sizes[], size_t totalSizes[], size_t& freeSize) const; | |
| 710 #endif | |
| 711 | |
| 708 private: | 712 private: |
| 709 int m_biggestFreeListIndex; | 713 int m_biggestFreeListIndex; |
| 710 | 714 |
| 711 // All FreeListEntries in the nth list have size >= 2^n. | 715 // All FreeListEntries in the nth list have size >= 2^n. |
| 712 FreeListEntry* m_freeLists[blinkPageSizeLog2]; | 716 FreeListEntry* m_freeLists[blinkPageSizeLog2]; |
| 713 | 717 |
| 714 friend class ThreadHeap; | 718 friend class ThreadHeap; |
| 715 }; | 719 }; |
| 716 | 720 |
| 717 // Thread heaps represent a part of the per-thread Blink heap. | 721 // Thread heaps represent a part of the per-thread Blink heap. |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 765 void completeSweep(); | 769 void completeSweep(); |
| 766 | 770 |
| 767 void freePage(HeapPage*); | 771 void freePage(HeapPage*); |
| 768 void freeLargeObject(LargeObject*); | 772 void freeLargeObject(LargeObject*); |
| 769 | 773 |
| 770 void promptlyFreeObject(HeapObjectHeader*); | 774 void promptlyFreeObject(HeapObjectHeader*); |
| 771 bool expandObject(HeapObjectHeader*, size_t); | 775 bool expandObject(HeapObjectHeader*, size_t); |
| 772 void shrinkObject(HeapObjectHeader*, size_t); | 776 void shrinkObject(HeapObjectHeader*, size_t); |
| 773 void decreasePromptlyFreedSize(size_t size) { m_promptlyFreedSize -= size; } | 777 void decreasePromptlyFreedSize(size_t size) { m_promptlyFreedSize -= size; } |
| 774 | 778 |
| 779 #if ENABLE(GC_PROFILING) | |
| 780 void snapshotFreeList(TracedValue&); | |
| 781 #endif | |
| 782 | |
| 775 private: | 783 private: |
| 776 Address outOfLineAllocate(size_t allocationSize, size_t gcInfoIndex); | 784 Address outOfLineAllocate(size_t allocationSize, size_t gcInfoIndex); |
| 777 Address currentAllocationPoint() const { return m_currentAllocationPoint; } | 785 Address currentAllocationPoint() const { return m_currentAllocationPoint; } |
| 778 size_t remainingAllocationSize() const { return m_remainingAllocationSize; } | 786 size_t remainingAllocationSize() const { return m_remainingAllocationSize; } |
| 779 bool hasCurrentAllocationArea() const { return currentAllocationPoint() && r emainingAllocationSize(); } | 787 bool hasCurrentAllocationArea() const { return currentAllocationPoint() && r emainingAllocationSize(); } |
| 780 inline void setAllocationPoint(Address, size_t); | 788 inline void setAllocationPoint(Address, size_t); |
| 781 void updateRemainingAllocationSize(); | 789 void updateRemainingAllocationSize(); |
| 782 Address allocateFromFreeList(size_t, size_t gcInfoIndex); | 790 Address allocateFromFreeList(size_t, size_t gcInfoIndex); |
| 783 Address lazySweepPages(size_t, size_t gcInfoIndex); | 791 Address lazySweepPages(size_t, size_t gcInfoIndex); |
| 784 bool lazySweepLargeObjects(size_t); | 792 bool lazySweepLargeObjects(size_t); |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 807 ThreadState* m_threadState; | 815 ThreadState* m_threadState; |
| 808 | 816 |
| 809 FreeList m_freeList; | 817 FreeList m_freeList; |
| 810 | 818 |
| 811 // Index into the page pools. This is used to ensure that the pages of the | 819 // Index into the page pools. This is used to ensure that the pages of the |
| 812 // same type go into the correct page pool and thus avoid type confusion. | 820 // same type go into the correct page pool and thus avoid type confusion. |
| 813 int m_index; | 821 int m_index; |
| 814 | 822 |
| 815 // The size of promptly freed objects in the heap. | 823 // The size of promptly freed objects in the heap. |
| 816 size_t m_promptlyFreedSize; | 824 size_t m_promptlyFreedSize; |
| 825 | |
| 826 #if ENABLE(GC_PROFILING) | |
| 827 double m_totalAllocationSize; | |
| 828 size_t m_allocationCount; | |
| 829 size_t m_inlineAllocationCount; | |
| 830 size_t m_allocationPointSizeSum; | |
| 831 size_t m_setAllocationPointCount; | |
| 832 #endif | |
| 817 }; | 833 }; |
| 818 | 834 |
| 819 // Mask an address down to the enclosing oilpan heap base page. All oilpan heap | 835 // Mask an address down to the enclosing oilpan heap base page. All oilpan heap |
| 820 // pages are aligned at blinkPageBase plus an OS page size. | 836 // pages are aligned at blinkPageBase plus an OS page size. |
| 821 // FIXME: Remove PLATFORM_EXPORT once we get a proper public interface to our | 837 // FIXME: Remove PLATFORM_EXPORT once we get a proper public interface to our |
| 822 // typed heaps. This is only exported to enable tests in HeapTest.cpp. | 838 // typed heaps. This is only exported to enable tests in HeapTest.cpp. |
| 823 PLATFORM_EXPORT inline BaseHeapPage* pageFromObject(const void* object) | 839 PLATFORM_EXPORT inline BaseHeapPage* pageFromObject(const void* object) |
| 824 { | 840 { |
| 825 Address address = reinterpret_cast<Address>(const_cast<void*>(object)); | 841 Address address = reinterpret_cast<Address>(const_cast<void*>(object)); |
| 826 BaseHeapPage* page = reinterpret_cast<BaseHeapPage*>(blinkPageAddress(addres s) + WTF::kSystemPageSize); | 842 BaseHeapPage* page = reinterpret_cast<BaseHeapPage*>(blinkPageAddress(addres s) + WTF::kSystemPageSize); |
| (...skipping 497 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1324 RELEASE_ASSERT(size < maxHeapObjectSize); | 1340 RELEASE_ASSERT(size < maxHeapObjectSize); |
| 1325 | 1341 |
| 1326 // Add space for header. | 1342 // Add space for header. |
| 1327 size_t allocationSize = size + sizeof(HeapObjectHeader); | 1343 size_t allocationSize = size + sizeof(HeapObjectHeader); |
| 1328 // Align size with allocation granularity. | 1344 // Align size with allocation granularity. |
| 1329 allocationSize = (allocationSize + allocationMask) & ~allocationMask; | 1345 allocationSize = (allocationSize + allocationMask) & ~allocationMask; |
| 1330 return allocationSize; | 1346 return allocationSize; |
| 1331 } | 1347 } |
| 1332 | 1348 |
| 1333 Address ThreadHeap::allocateObject(size_t allocationSize, size_t gcInfoIndex) | 1349 Address ThreadHeap::allocateObject(size_t allocationSize, size_t gcInfoIndex) |
| 1334 { | 1350 { |
|
keishi
2015/02/04 06:58:26
Shouldn't we be updating m_totalAllocationSize her
Yuta Kitamura
2015/02/04 09:45:42
Do'h, you are right. Fixed.
| |
| 1335 if (LIKELY(allocationSize <= m_remainingAllocationSize)) { | 1351 if (LIKELY(allocationSize <= m_remainingAllocationSize)) { |
| 1336 Address headerAddress = m_currentAllocationPoint; | 1352 Address headerAddress = m_currentAllocationPoint; |
| 1337 m_currentAllocationPoint += allocationSize; | 1353 m_currentAllocationPoint += allocationSize; |
| 1338 m_remainingAllocationSize -= allocationSize; | 1354 m_remainingAllocationSize -= allocationSize; |
| 1339 ASSERT(gcInfoIndex > 0); | 1355 ASSERT(gcInfoIndex > 0); |
| 1340 new (NotNull, headerAddress) HeapObjectHeader(allocationSize, gcInfoInde x); | 1356 new (NotNull, headerAddress) HeapObjectHeader(allocationSize, gcInfoInde x); |
| 1341 Address result = headerAddress + sizeof(HeapObjectHeader); | 1357 Address result = headerAddress + sizeof(HeapObjectHeader); |
| 1342 ASSERT(!(reinterpret_cast<uintptr_t>(result) & allocationMask)); | 1358 ASSERT(!(reinterpret_cast<uintptr_t>(result) & allocationMask)); |
| 1343 | 1359 |
| 1344 // Unpoison the memory used for the object (payload). | 1360 // Unpoison the memory used for the object (payload). |
| (...skipping 1077 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2422 template<typename T, size_t inlineCapacity> | 2438 template<typename T, size_t inlineCapacity> |
| 2423 struct GCInfoTrait<HeapVector<T, inlineCapacity>> : public GCInfoTrait<Vector<T, inlineCapacity, HeapAllocator>> { }; | 2439 struct GCInfoTrait<HeapVector<T, inlineCapacity>> : public GCInfoTrait<Vector<T, inlineCapacity, HeapAllocator>> { }; |
| 2424 template<typename T, size_t inlineCapacity> | 2440 template<typename T, size_t inlineCapacity> |
| 2425 struct GCInfoTrait<HeapDeque<T, inlineCapacity>> : public GCInfoTrait<Deque<T, i nlineCapacity, HeapAllocator>> { }; | 2441 struct GCInfoTrait<HeapDeque<T, inlineCapacity>> : public GCInfoTrait<Deque<T, i nlineCapacity, HeapAllocator>> { }; |
| 2426 template<typename T, typename U, typename V> | 2442 template<typename T, typename U, typename V> |
| 2427 struct GCInfoTrait<HeapHashCountedSet<T, U, V>> : public GCInfoTrait<HashCounted Set<T, U, V, HeapAllocator>> { }; | 2443 struct GCInfoTrait<HeapHashCountedSet<T, U, V>> : public GCInfoTrait<HashCounted Set<T, U, V, HeapAllocator>> { }; |
| 2428 | 2444 |
| 2429 } // namespace blink | 2445 } // namespace blink |
| 2430 | 2446 |
| 2431 #endif // Heap_h | 2447 #endif // Heap_h |
| OLD | NEW |