Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(892)

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

Issue 383743002: Oilpan: GC profiling. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: removed Profiling.h Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
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 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
58 // not spread out too much over the address space which would blow 58 // not spread out too much over the address space which would blow
59 // away the page tables and lead to bad performance. 59 // away the page tables and lead to bad performance.
60 const size_t blinkPagesPerRegion = 10; 60 const size_t blinkPagesPerRegion = 10;
61 61
62 // Double precision floats are more efficient when 8 byte aligned, so we 8 byte 62 // Double precision floats are more efficient when 8 byte aligned, so we 8 byte
63 // align all allocations even on 32 bit. 63 // align all allocations even on 32 bit.
64 const size_t allocationGranularity = 8; 64 const size_t allocationGranularity = 8;
65 const size_t allocationMask = allocationGranularity - 1; 65 const size_t allocationMask = allocationGranularity - 1;
66 const size_t objectStartBitMapSize = (blinkPageSize + ((8 * allocationGranularit y) - 1)) / (8 * allocationGranularity); 66 const size_t objectStartBitMapSize = (blinkPageSize + ((8 * allocationGranularit y) - 1)) / (8 * allocationGranularity);
67 const size_t reservedForObjectBitMap = ((objectStartBitMapSize + allocationMask) & ~allocationMask); 67 const size_t reservedForObjectBitMap = ((objectStartBitMapSize + allocationMask) & ~allocationMask);
68 const size_t maxHeapObjectSize = 1 << 27; 68 const size_t maxHeapObjectSizeLog2 = 27;
69 const size_t maxHeapObjectSize = 1 << maxHeapObjectSizeLog2;
69 70
70 const size_t markBitMask = 1; 71 const size_t markBitMask = 1;
71 const size_t freeListMask = 2; 72 const size_t freeListMask = 2;
72 // The dead bit is used for objects that have gone through a GC marking, but did 73 // The dead bit is used for objects that have gone through a GC marking, but did
73 // not get swept before a new GC started. In that case we set the dead bit on 74 // not get swept before a new GC started. In that case we set the dead bit on
74 // objects that were not marked in the previous GC to ensure we are not tracing 75 // objects that were not marked in the previous GC to ensure we are not tracing
75 // them via a conservatively found pointer. Tracing dead objects could lead to 76 // them via a conservatively found pointer. Tracing dead objects could lead to
76 // tracing of already finalized objects in another thread's heap which is a 77 // tracing of already finalized objects in another thread's heap which is a
77 // use-after-free situation. 78 // use-after-free situation.
78 const size_t deadBitMask = 4; 79 const size_t deadBitMask = 4;
79 const size_t sizeMask = ~static_cast<size_t>(7); 80 #if ENABLE(GC_PROFILE_HEAP)
81 const size_t heapObjectGenerations = 8;
82 const size_t maxHeapObjectAge = heapObjectGenerations - 1;
83 const size_t heapObjectAgeMask = ~(maxHeapObjectSize - 1);
84 const size_t sizeMask = ~heapObjectAgeMask & ~7;
85 #else
86 const size_t sizeMask = ~7;
87 #endif
80 const uint8_t freelistZapValue = 42; 88 const uint8_t freelistZapValue = 42;
81 const uint8_t finalizedZapValue = 24; 89 const uint8_t finalizedZapValue = 24;
82 // The orphaned zap value must be zero in the lowest bits to allow for using 90 // The orphaned zap value must be zero in the lowest bits to allow for using
83 // the mark bit when tracing. 91 // the mark bit when tracing.
84 const uint8_t orphanedZapValue = 240; 92 const uint8_t orphanedZapValue = 240;
85 93
86 enum CallbackInvocationMode { 94 enum CallbackInvocationMode {
87 GlobalMarking, 95 GlobalMarking,
88 ThreadLocalMarking, 96 ThreadLocalMarking,
89 WeaknessProcessing, 97 WeaknessProcessing,
90 }; 98 };
91 99
92 class HeapStats; 100 class HeapStats;
93 class PageMemory; 101 class PageMemory;
94 template<ThreadAffinity affinity> class ThreadLocalPersistents; 102 template<ThreadAffinity affinity> class ThreadLocalPersistents;
95 template<typename T, typename RootsAccessor = ThreadLocalPersistents<ThreadingTr ait<T>::Affinity > > class Persistent; 103 template<typename T, typename RootsAccessor = ThreadLocalPersistents<ThreadingTr ait<T>::Affinity > > class Persistent;
96 template<typename T> class CrossThreadPersistent; 104 template<typename T> class CrossThreadPersistent;
97 105
106 #if ENABLE(GC_PROFILE_HEAP)
107 class TracedArrayBase;
108 class TracedDictionaryBase;
109 #endif
110
98 PLATFORM_EXPORT size_t osPageSize(); 111 PLATFORM_EXPORT size_t osPageSize();
99 112
100 // Blink heap pages are set up with a guard page before and after the 113 // Blink heap pages are set up with a guard page before and after the
101 // payload. 114 // payload.
102 inline size_t blinkPagePayloadSize() 115 inline size_t blinkPagePayloadSize()
103 { 116 {
104 return blinkPageSize - 2 * osPageSize(); 117 return blinkPageSize - 2 * osPageSize();
105 } 118 }
106 119
107 // Blink heap pages are aligned to the Blink heap page size. 120 // Blink heap pages are aligned to the Blink heap page size.
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
166 class LargeHeapObject : public BaseHeapPage { 179 class LargeHeapObject : public BaseHeapPage {
167 public: 180 public:
168 LargeHeapObject(PageMemory* storage, const GCInfo* gcInfo, ThreadState* stat e) : BaseHeapPage(storage, gcInfo, state) 181 LargeHeapObject(PageMemory* storage, const GCInfo* gcInfo, ThreadState* stat e) : BaseHeapPage(storage, gcInfo, state)
169 { 182 {
170 COMPILE_ASSERT(!(sizeof(LargeHeapObject<Header>) & allocationMask), larg e_heap_object_header_misaligned); 183 COMPILE_ASSERT(!(sizeof(LargeHeapObject<Header>) & allocationMask), larg e_heap_object_header_misaligned);
171 } 184 }
172 185
173 virtual void checkAndMarkPointer(Visitor*, Address) OVERRIDE; 186 virtual void checkAndMarkPointer(Visitor*, Address) OVERRIDE;
174 virtual bool isLargeObject() OVERRIDE { return true; } 187 virtual bool isLargeObject() OVERRIDE { return true; }
175 188
176 #if ENABLE(GC_TRACING) 189 #if ENABLE(GC_PROFILE_MARKING)
177 virtual const GCInfo* findGCInfo(Address address) 190 virtual const GCInfo* findGCInfo(Address address)
178 { 191 {
179 if (!objectContains(address)) 192 if (!objectContains(address))
180 return 0; 193 return 0;
181 return gcInfo(); 194 return gcInfo();
182 } 195 }
183 #endif 196 #endif
184 197
198 #if ENABLE(GC_PROFILE_HEAP)
199 void snapshot(TracedDictionaryBase*, ThreadState::SnapshotInfo*);
200 #endif
201
185 void link(LargeHeapObject<Header>** previousNext) 202 void link(LargeHeapObject<Header>** previousNext)
186 { 203 {
187 m_next = *previousNext; 204 m_next = *previousNext;
188 *previousNext = this; 205 *previousNext = this;
189 } 206 }
190 207
191 void unlink(LargeHeapObject<Header>** previousNext) 208 void unlink(LargeHeapObject<Header>** previousNext)
192 { 209 {
193 *previousNext = m_next; 210 *previousNext = m_next;
194 } 211 }
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
257 : m_size(encodedSize) { } 274 : m_size(encodedSize) { }
258 275
259 static size_t freeListEncodedSize(size_t size) { return size | freeListMask; } 276 static size_t freeListEncodedSize(size_t size) { return size | freeListMask; }
260 277
261 NO_SANITIZE_ADDRESS 278 NO_SANITIZE_ADDRESS
262 bool isFree() { return m_size & freeListMask; } 279 bool isFree() { return m_size & freeListMask; }
263 280
264 NO_SANITIZE_ADDRESS 281 NO_SANITIZE_ADDRESS
265 size_t size() const { return m_size & sizeMask; } 282 size_t size() const { return m_size & sizeMask; }
266 283
284 #if ENABLE(GC_PROFILE_HEAP)
285 NO_SANITIZE_ADDRESS
286 size_t encodedSize() const { return m_size; }
287
288 NO_SANITIZE_ADDRESS
289 size_t age() const { return m_size >> maxHeapObjectSizeLog2; }
290
291 NO_SANITIZE_ADDRESS
292 void incAge()
293 {
294 size_t current = age();
295 if (current < maxHeapObjectAge)
296 m_size = ((current + 1) << maxHeapObjectSizeLog2) | (m_size & ~heapO bjectAgeMask);
297 }
298 #endif
299
267 protected: 300 protected:
268 size_t m_size; 301 size_t m_size;
269 }; 302 };
270 303
271 // Our heap object layout is layered with the HeapObjectHeader closest 304 // Our heap object layout is layered with the HeapObjectHeader closest
272 // to the payload, this can be wrapped in a FinalizedObjectHeader if the 305 // to the payload, this can be wrapped in a FinalizedObjectHeader if the
273 // object is on the GeneralHeap and not on a specific TypedHeap. 306 // object is on the GeneralHeap and not on a specific TypedHeap.
274 // Finally if the object is a large object (> blinkPageSize/2) then it is 307 // Finally if the object is a large object (> blinkPageSize/2) then it is
275 // wrapped with a LargeObjectHeader. 308 // wrapped with a LargeObjectHeader.
276 // 309 //
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after
467 } 500 }
468 501
469 Address end() { return payload() + payloadSize(); } 502 Address end() { return payload() + payloadSize(); }
470 503
471 void getStats(HeapStats&); 504 void getStats(HeapStats&);
472 void clearLiveAndMarkDead(); 505 void clearLiveAndMarkDead();
473 void sweep(); 506 void sweep();
474 void clearObjectStartBitMap(); 507 void clearObjectStartBitMap();
475 void finalize(Header*); 508 void finalize(Header*);
476 virtual void checkAndMarkPointer(Visitor*, Address) OVERRIDE; 509 virtual void checkAndMarkPointer(Visitor*, Address) OVERRIDE;
477 #if ENABLE(GC_TRACING) 510 #if ENABLE(GC_PROFILE_MARKING)
478 const GCInfo* findGCInfo(Address) OVERRIDE; 511 const GCInfo* findGCInfo(Address) OVERRIDE;
479 #endif 512 #endif
513 #if ENABLE(GC_PROFILE_HEAP)
514 virtual void snapshot(TracedArrayBase*, ThreadState::SnapshotInfo*);
515 #endif
480 ThreadHeap<Header>* heap() { return m_heap; } 516 ThreadHeap<Header>* heap() { return m_heap; }
481 #if defined(ADDRESS_SANITIZER) 517 #if defined(ADDRESS_SANITIZER)
482 void poisonUnmarkedObjects(); 518 void poisonUnmarkedObjects();
483 #endif 519 #endif
484 NO_SANITIZE_ADDRESS 520 NO_SANITIZE_ADDRESS
485 virtual void markOrphaned() 521 virtual void markOrphaned()
486 { 522 {
487 // Zap the payload with a recognizable value to detect any incorrect 523 // Zap the payload with a recognizable value to detect any incorrect
488 // cross thread pointer usage. 524 // cross thread pointer usage.
489 #if defined(ADDRESS_SANITIZER) 525 #if defined(ADDRESS_SANITIZER)
(...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after
799 class BaseHeap { 835 class BaseHeap {
800 public: 836 public:
801 virtual ~BaseHeap() { } 837 virtual ~BaseHeap() { }
802 virtual void cleanupPages() = 0; 838 virtual void cleanupPages() = 0;
803 839
804 // Find the page in this thread heap containing the given 840 // Find the page in this thread heap containing the given
805 // address. Returns 0 if the address is not contained in any 841 // address. Returns 0 if the address is not contained in any
806 // page in this thread heap. 842 // page in this thread heap.
807 virtual BaseHeapPage* heapPageFromAddress(Address) = 0; 843 virtual BaseHeapPage* heapPageFromAddress(Address) = 0;
808 844
809 #if ENABLE(GC_TRACING) 845 #if ENABLE(GC_PROFILE_MARKING)
810 virtual const GCInfo* findGCInfoOfLargeHeapObject(Address) = 0; 846 virtual const GCInfo* findGCInfoOfLargeHeapObject(Address) = 0;
811 #endif 847 #endif
812 848
849 #if ENABLE(GC_PROFILE_HEAP)
850 virtual void snapshot(TracedDictionaryBase*, ThreadState::SnapshotInfo*) = 0 ;
851 #endif
852
813 // Sweep this part of the Blink heap. This finalizes dead objects 853 // Sweep this part of the Blink heap. This finalizes dead objects
814 // and builds freelists for all the unused memory. 854 // and builds freelists for all the unused memory.
815 virtual void sweep() = 0; 855 virtual void sweep() = 0;
816 856
817 virtual void clearFreeLists() = 0; 857 virtual void clearFreeLists() = 0;
818 virtual void clearLiveAndMarkDead() = 0; 858 virtual void clearLiveAndMarkDead() = 0;
819 #if ENABLE(ASSERT) 859 #if ENABLE(ASSERT)
820 virtual void getScannedStats(HeapStats&) = 0; 860 virtual void getScannedStats(HeapStats&) = 0;
821 #endif 861 #endif
822 862
(...skipping 19 matching lines...) Expand all
842 // objects during conservative stack scanning and to sweep the set of 882 // objects during conservative stack scanning and to sweep the set of
843 // pages after a GC. 883 // pages after a GC.
844 template<typename Header> 884 template<typename Header>
845 class ThreadHeap : public BaseHeap { 885 class ThreadHeap : public BaseHeap {
846 public: 886 public:
847 ThreadHeap(ThreadState*, int); 887 ThreadHeap(ThreadState*, int);
848 virtual ~ThreadHeap(); 888 virtual ~ThreadHeap();
849 virtual void cleanupPages(); 889 virtual void cleanupPages();
850 890
851 virtual BaseHeapPage* heapPageFromAddress(Address); 891 virtual BaseHeapPage* heapPageFromAddress(Address);
852 #if ENABLE(GC_TRACING) 892 #if ENABLE(GC_PROFILE_MARKING)
853 virtual const GCInfo* findGCInfoOfLargeHeapObject(Address); 893 virtual const GCInfo* findGCInfoOfLargeHeapObject(Address);
854 #endif 894 #endif
895 #if ENABLE(GC_PROFILE_HEAP)
896 virtual void snapshot(TracedDictionaryBase*, ThreadState::SnapshotInfo*);
897 #endif
855 virtual void sweep(); 898 virtual void sweep();
856 virtual void clearFreeLists(); 899 virtual void clearFreeLists();
857 virtual void clearLiveAndMarkDead(); 900 virtual void clearLiveAndMarkDead();
858 #if ENABLE(ASSERT) 901 #if ENABLE(ASSERT)
859 virtual void getScannedStats(HeapStats&); 902 virtual void getScannedStats(HeapStats&);
860 #endif 903 #endif
861 904
862 virtual void makeConsistentForGC(); 905 virtual void makeConsistentForGC();
863 virtual bool isConsistentForGC(); 906 virtual bool isConsistentForGC();
864 907
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
972 template<CallbackInvocationMode Mode> static void processMarkingStack(); 1015 template<CallbackInvocationMode Mode> static void processMarkingStack();
973 static void globalWeakProcessingAndCleanup(); 1016 static void globalWeakProcessingAndCleanup();
974 static void setForcePreciseGCForTesting(); 1017 static void setForcePreciseGCForTesting();
975 1018
976 static void prepareForGC(); 1019 static void prepareForGC();
977 1020
978 // Conservatively checks whether an address is a pointer in any of the threa d 1021 // Conservatively checks whether an address is a pointer in any of the threa d
979 // heaps. If so marks the object pointed to as live. 1022 // heaps. If so marks the object pointed to as live.
980 static Address checkAndMarkPointer(Visitor*, Address); 1023 static Address checkAndMarkPointer(Visitor*, Address);
981 1024
982 #if ENABLE(GC_TRACING) 1025 #if ENABLE(GC_PROFILE_MARKING)
983 // Dump the path to specified object on the next GC. This method is to be in voked from GDB. 1026 // Dump the path to specified object on the next GC. This method is to be in voked from GDB.
984 static void dumpPathToObjectOnNextGC(void* p); 1027 static void dumpPathToObjectOnNextGC(void* p);
985 1028
986 // Forcibly find GCInfo of the object at Address. 1029 // Forcibly find GCInfo of the object at Address.
987 // This is slow and should only be used for debug purposes. 1030 // This is slow and should only be used for debug purposes.
988 // It involves finding the heap page and scanning the heap page for an objec t header. 1031 // It involves finding the heap page and scanning the heap page for an objec t header.
989 static const GCInfo* findGCInfo(Address); 1032 static const GCInfo* findGCInfo(Address);
990 1033
991 static String createBacktraceString(); 1034 static String createBacktraceString();
992 #endif 1035 #endif
(...skipping 828 matching lines...) Expand 10 before | Expand all | Expand 10 after
1821 template<typename Key, typename Value, typename T, typename U, typename V> 1864 template<typename Key, typename Value, typename T, typename U, typename V>
1822 struct GCInfoTrait<HashMap<Key, Value, T, U, V, HeapAllocator> > { 1865 struct GCInfoTrait<HashMap<Key, Value, T, U, V, HeapAllocator> > {
1823 static const GCInfo* get() 1866 static const GCInfo* get()
1824 { 1867 {
1825 typedef HashMap<Key, Value, T, U, V, HeapAllocator> TargetType; 1868 typedef HashMap<Key, Value, T, U, V, HeapAllocator> TargetType;
1826 static const GCInfo info = { 1869 static const GCInfo info = {
1827 TraceTrait<TargetType>::trace, 1870 TraceTrait<TargetType>::trace,
1828 0, 1871 0,
1829 false, // HashMap needs no finalizer. 1872 false, // HashMap needs no finalizer.
1830 WTF::IsPolymorphic<TargetType>::value, 1873 WTF::IsPolymorphic<TargetType>::value,
1831 #if ENABLE(GC_TRACING) 1874 #if ENABLE(GC_PROFILING)
1832 TypenameStringTrait<TargetType>::get() 1875 TypenameStringTrait<TargetType>::get()
1833 #endif 1876 #endif
1834 }; 1877 };
1835 return &info; 1878 return &info;
1836 } 1879 }
1837 }; 1880 };
1838 1881
1839 template<typename T, typename U, typename V> 1882 template<typename T, typename U, typename V>
1840 struct GCInfoTrait<HashSet<T, U, V, HeapAllocator> > { 1883 struct GCInfoTrait<HashSet<T, U, V, HeapAllocator> > {
1841 static const GCInfo* get() 1884 static const GCInfo* get()
1842 { 1885 {
1843 typedef HashSet<T, U, V, HeapAllocator> TargetType; 1886 typedef HashSet<T, U, V, HeapAllocator> TargetType;
1844 static const GCInfo info = { 1887 static const GCInfo info = {
1845 TraceTrait<TargetType>::trace, 1888 TraceTrait<TargetType>::trace,
1846 0, 1889 0,
1847 false, // HashSet needs no finalizer. 1890 false, // HashSet needs no finalizer.
1848 WTF::IsPolymorphic<TargetType>::value, 1891 WTF::IsPolymorphic<TargetType>::value,
1849 #if ENABLE(GC_TRACING) 1892 #if ENABLE(GC_PROFILING)
1850 TypenameStringTrait<TargetType>::get() 1893 TypenameStringTrait<TargetType>::get()
1851 #endif 1894 #endif
1852 }; 1895 };
1853 return &info; 1896 return &info;
1854 } 1897 }
1855 }; 1898 };
1856 1899
1857 template<typename T, typename U, typename V> 1900 template<typename T, typename U, typename V>
1858 struct GCInfoTrait<LinkedHashSet<T, U, V, HeapAllocator> > { 1901 struct GCInfoTrait<LinkedHashSet<T, U, V, HeapAllocator> > {
1859 static const GCInfo* get() 1902 static const GCInfo* get()
1860 { 1903 {
1861 typedef LinkedHashSet<T, U, V, HeapAllocator> TargetType; 1904 typedef LinkedHashSet<T, U, V, HeapAllocator> TargetType;
1862 static const GCInfo info = { 1905 static const GCInfo info = {
1863 TraceTrait<TargetType>::trace, 1906 TraceTrait<TargetType>::trace,
1864 LinkedHashSet<T, U, V, HeapAllocator>::finalize, 1907 LinkedHashSet<T, U, V, HeapAllocator>::finalize,
1865 true, // Needs finalization. The anchor needs to unlink itself from the chain. 1908 true, // Needs finalization. The anchor needs to unlink itself from the chain.
1866 WTF::IsPolymorphic<TargetType>::value, 1909 WTF::IsPolymorphic<TargetType>::value,
1867 #if ENABLE(GC_TRACING) 1910 #if ENABLE(GC_PROFILING)
1868 TypenameStringTrait<TargetType>::get() 1911 TypenameStringTrait<TargetType>::get()
1869 #endif 1912 #endif
1870 }; 1913 };
1871 return &info; 1914 return &info;
1872 } 1915 }
1873 }; 1916 };
1874 1917
1875 template<typename ValueArg, size_t inlineCapacity, typename U> 1918 template<typename ValueArg, size_t inlineCapacity, typename U>
1876 struct GCInfoTrait<ListHashSet<ValueArg, inlineCapacity, U, HeapListHashSetAlloc ator<ValueArg, inlineCapacity> > > { 1919 struct GCInfoTrait<ListHashSet<ValueArg, inlineCapacity, U, HeapListHashSetAlloc ator<ValueArg, inlineCapacity> > > {
1877 static const GCInfo* get() 1920 static const GCInfo* get()
1878 { 1921 {
1879 typedef WTF::ListHashSet<ValueArg, inlineCapacity, U, HeapListHashSetAll ocator<ValueArg, inlineCapacity> > TargetType; 1922 typedef WTF::ListHashSet<ValueArg, inlineCapacity, U, HeapListHashSetAll ocator<ValueArg, inlineCapacity> > TargetType;
1880 static const GCInfo info = { 1923 static const GCInfo info = {
1881 TraceTrait<TargetType>::trace, 1924 TraceTrait<TargetType>::trace,
1882 0, 1925 0,
1883 false, // ListHashSet needs no finalization though its backing might . 1926 false, // ListHashSet needs no finalization though its backing might .
1884 false, // no vtable. 1927 false, // no vtable.
1885 #if ENABLE(GC_TRACING) 1928 #if ENABLE(GC_PROFILING)
1886 TypenameStringTrait<TargetType>::get() 1929 TypenameStringTrait<TargetType>::get()
1887 #endif 1930 #endif
1888 }; 1931 };
1889 return &info; 1932 return &info;
1890 } 1933 }
1891 }; 1934 };
1892 1935
1893 template<typename T, typename Allocator> 1936 template<typename T, typename Allocator>
1894 struct GCInfoTrait<WTF::ListHashSetNode<T, Allocator> > { 1937 struct GCInfoTrait<WTF::ListHashSetNode<T, Allocator> > {
1895 static const GCInfo* get() 1938 static const GCInfo* get()
1896 { 1939 {
1897 typedef WTF::ListHashSetNode<T, Allocator> TargetType; 1940 typedef WTF::ListHashSetNode<T, Allocator> TargetType;
1898 static const GCInfo info = { 1941 static const GCInfo info = {
1899 TraceTrait<TargetType>::trace, 1942 TraceTrait<TargetType>::trace,
1900 TargetType::finalize, 1943 TargetType::finalize,
1901 WTF::HashTraits<T>::needsDestruction, // The node needs destruction if its data does. 1944 WTF::HashTraits<T>::needsDestruction, // The node needs destruction if its data does.
1902 false, // no vtable. 1945 false, // no vtable.
1903 #if ENABLE(GC_TRACING) 1946 #if ENABLE(GC_PROFILING)
1904 TypenameStringTrait<TargetType>::get() 1947 TypenameStringTrait<TargetType>::get()
1905 #endif 1948 #endif
1906 }; 1949 };
1907 return &info; 1950 return &info;
1908 } 1951 }
1909 }; 1952 };
1910 1953
1911 template<typename T> 1954 template<typename T>
1912 struct GCInfoTrait<Vector<T, 0, HeapAllocator> > { 1955 struct GCInfoTrait<Vector<T, 0, HeapAllocator> > {
1913 static const GCInfo* get() 1956 static const GCInfo* get()
1914 { 1957 {
1915 #if ENABLE(GC_TRACING) 1958 #if ENABLE(GC_PROFILING)
1916 typedef Vector<T, 0, HeapAllocator> TargetType; 1959 typedef Vector<T, 0, HeapAllocator> TargetType;
1917 #endif 1960 #endif
1918 static const GCInfo info = { 1961 static const GCInfo info = {
1919 TraceTrait<Vector<T, 0, HeapAllocator> >::trace, 1962 TraceTrait<Vector<T, 0, HeapAllocator> >::trace,
1920 0, 1963 0,
1921 false, // Vector needs no finalizer if it has no inline capacity. 1964 false, // Vector needs no finalizer if it has no inline capacity.
1922 WTF::IsPolymorphic<Vector<T, 0, HeapAllocator> >::value, 1965 WTF::IsPolymorphic<Vector<T, 0, HeapAllocator> >::value,
1923 #if ENABLE(GC_TRACING) 1966 #if ENABLE(GC_PROFILING)
1924 TypenameStringTrait<TargetType>::get() 1967 TypenameStringTrait<TargetType>::get()
1925 #endif 1968 #endif
1926 }; 1969 };
1927 return &info; 1970 return &info;
1928 } 1971 }
1929 }; 1972 };
1930 1973
1931 template<typename T, size_t inlineCapacity> 1974 template<typename T, size_t inlineCapacity>
1932 struct FinalizerTrait<Vector<T, inlineCapacity, HeapAllocator> > : public Finali zerTraitImpl<Vector<T, inlineCapacity, HeapAllocator>, true> { }; 1975 struct FinalizerTrait<Vector<T, inlineCapacity, HeapAllocator> > : public Finali zerTraitImpl<Vector<T, inlineCapacity, HeapAllocator>, true> { };
1933 1976
1934 template<typename T, size_t inlineCapacity> 1977 template<typename T, size_t inlineCapacity>
1935 struct GCInfoTrait<Vector<T, inlineCapacity, HeapAllocator> > { 1978 struct GCInfoTrait<Vector<T, inlineCapacity, HeapAllocator> > {
1936 static const GCInfo* get() 1979 static const GCInfo* get()
1937 { 1980 {
1938 typedef Vector<T, inlineCapacity, HeapAllocator> TargetType; 1981 typedef Vector<T, inlineCapacity, HeapAllocator> TargetType;
1939 static const GCInfo info = { 1982 static const GCInfo info = {
1940 TraceTrait<TargetType>::trace, 1983 TraceTrait<TargetType>::trace,
1941 FinalizerTrait<TargetType>::finalize, 1984 FinalizerTrait<TargetType>::finalize,
1942 // Finalizer is needed to destruct things stored in the inline capac ity. 1985 // Finalizer is needed to destruct things stored in the inline capac ity.
1943 inlineCapacity && VectorTraits<T>::needsDestruction, 1986 inlineCapacity && VectorTraits<T>::needsDestruction,
1944 WTF::IsPolymorphic<TargetType>::value, 1987 WTF::IsPolymorphic<TargetType>::value,
1945 #if ENABLE(GC_TRACING) 1988 #if ENABLE(GC_PROFILING)
1946 TypenameStringTrait<TargetType>::get() 1989 TypenameStringTrait<TargetType>::get()
1947 #endif 1990 #endif
1948 }; 1991 };
1949 return &info; 1992 return &info;
1950 } 1993 }
1951 }; 1994 };
1952 1995
1953 template<typename T> 1996 template<typename T>
1954 struct GCInfoTrait<Deque<T, 0, HeapAllocator> > { 1997 struct GCInfoTrait<Deque<T, 0, HeapAllocator> > {
1955 static const GCInfo* get() 1998 static const GCInfo* get()
1956 { 1999 {
1957 typedef Deque<T, 0, HeapAllocator> TargetType; 2000 typedef Deque<T, 0, HeapAllocator> TargetType;
1958 static const GCInfo info = { 2001 static const GCInfo info = {
1959 TraceTrait<TargetType>::trace, 2002 TraceTrait<TargetType>::trace,
1960 0, 2003 0,
1961 false, // Deque needs no finalizer if it has no inline capacity. 2004 false, // Deque needs no finalizer if it has no inline capacity.
1962 WTF::IsPolymorphic<TargetType>::value, 2005 WTF::IsPolymorphic<TargetType>::value,
1963 #if ENABLE(GC_TRACING) 2006 #if ENABLE(GC_PROFILING)
1964 TypenameStringTrait<TargetType>::get() 2007 TypenameStringTrait<TargetType>::get()
1965 #endif 2008 #endif
1966 }; 2009 };
1967 return &info; 2010 return &info;
1968 } 2011 }
1969 static const GCInfo info; 2012 static const GCInfo info;
1970 }; 2013 };
1971 2014
1972 template<typename T, typename U, typename V> 2015 template<typename T, typename U, typename V>
1973 struct GCInfoTrait<HashCountedSet<T, U, V, HeapAllocator> > { 2016 struct GCInfoTrait<HashCountedSet<T, U, V, HeapAllocator> > {
1974 static const GCInfo* get() 2017 static const GCInfo* get()
1975 { 2018 {
1976 typedef HashCountedSet<T, U, V, HeapAllocator> TargetType; 2019 typedef HashCountedSet<T, U, V, HeapAllocator> TargetType;
1977 static const GCInfo info = { 2020 static const GCInfo info = {
1978 TraceTrait<TargetType>::trace, 2021 TraceTrait<TargetType>::trace,
1979 0, 2022 0,
1980 false, // HashCountedSet is just a HashTable, and needs no finalizer . 2023 false, // HashCountedSet is just a HashTable, and needs no finalizer .
1981 WTF::IsPolymorphic<TargetType>::value, 2024 WTF::IsPolymorphic<TargetType>::value,
1982 #if ENABLE(GC_TRACING) 2025 #if ENABLE(GC_PROFILING)
1983 TypenameStringTrait<TargetType>::get() 2026 TypenameStringTrait<TargetType>::get()
1984 #endif 2027 #endif
1985 }; 2028 };
1986 return &info; 2029 return &info;
1987 } 2030 }
1988 static const GCInfo info; 2031 static const GCInfo info;
1989 }; 2032 };
1990 2033
1991 template<typename T, size_t inlineCapacity> 2034 template<typename T, size_t inlineCapacity>
1992 struct FinalizerTrait<Deque<T, inlineCapacity, HeapAllocator> > : public Finaliz erTraitImpl<Deque<T, inlineCapacity, HeapAllocator>, true> { }; 2035 struct FinalizerTrait<Deque<T, inlineCapacity, HeapAllocator> > : public Finaliz erTraitImpl<Deque<T, inlineCapacity, HeapAllocator>, true> { };
1993 2036
1994 template<typename T, size_t inlineCapacity> 2037 template<typename T, size_t inlineCapacity>
1995 struct GCInfoTrait<Deque<T, inlineCapacity, HeapAllocator> > { 2038 struct GCInfoTrait<Deque<T, inlineCapacity, HeapAllocator> > {
1996 static const GCInfo* get() 2039 static const GCInfo* get()
1997 { 2040 {
1998 typedef Deque<T, inlineCapacity, HeapAllocator> TargetType; 2041 typedef Deque<T, inlineCapacity, HeapAllocator> TargetType;
1999 static const GCInfo info = { 2042 static const GCInfo info = {
2000 TraceTrait<TargetType>::trace, 2043 TraceTrait<TargetType>::trace,
2001 FinalizerTrait<TargetType>::finalize, 2044 FinalizerTrait<TargetType>::finalize,
2002 // Finalizer is needed to destruct things stored in the inline capac ity. 2045 // Finalizer is needed to destruct things stored in the inline capac ity.
2003 inlineCapacity && VectorTraits<T>::needsDestruction, 2046 inlineCapacity && VectorTraits<T>::needsDestruction,
2004 WTF::IsPolymorphic<TargetType>::value, 2047 WTF::IsPolymorphic<TargetType>::value,
2005 #if ENABLE(GC_TRACING) 2048 #if ENABLE(GC_PROFILING)
2006 TypenameStringTrait<TargetType>::get() 2049 TypenameStringTrait<TargetType>::get()
2007 #endif 2050 #endif
2008 }; 2051 };
2009 return &info; 2052 return &info;
2010 } 2053 }
2011 static const GCInfo info; 2054 static const GCInfo info;
2012 }; 2055 };
2013 2056
2014 template<typename T, typename Traits> 2057 template<typename T, typename Traits>
2015 struct GCInfoTrait<HeapVectorBacking<T, Traits> > { 2058 struct GCInfoTrait<HeapVectorBacking<T, Traits> > {
2016 static const GCInfo* get() 2059 static const GCInfo* get()
2017 { 2060 {
2018 typedef HeapVectorBacking<T, Traits> TargetType; 2061 typedef HeapVectorBacking<T, Traits> TargetType;
2019 static const GCInfo info = { 2062 static const GCInfo info = {
2020 TraceTrait<TargetType>::trace, 2063 TraceTrait<TargetType>::trace,
2021 FinalizerTrait<TargetType>::finalize, 2064 FinalizerTrait<TargetType>::finalize,
2022 Traits::needsDestruction, 2065 Traits::needsDestruction,
2023 false, // We don't support embedded objects in HeapVectors with vtab les. 2066 false, // We don't support embedded objects in HeapVectors with vtab les.
2024 #if ENABLE(GC_TRACING) 2067 #if ENABLE(GC_PROFILING)
2025 TypenameStringTrait<TargetType>::get() 2068 TypenameStringTrait<TargetType>::get()
2026 #endif 2069 #endif
2027 }; 2070 };
2028 return &info; 2071 return &info;
2029 } 2072 }
2030 }; 2073 };
2031 2074
2032 template<typename Table> 2075 template<typename Table>
2033 struct GCInfoTrait<HeapHashTableBacking<Table> > { 2076 struct GCInfoTrait<HeapHashTableBacking<Table> > {
2034 static const GCInfo* get() 2077 static const GCInfo* get()
2035 { 2078 {
2036 typedef HeapHashTableBacking<Table> TargetType; 2079 typedef HeapHashTableBacking<Table> TargetType;
2037 static const GCInfo info = { 2080 static const GCInfo info = {
2038 TraceTrait<TargetType>::trace, 2081 TraceTrait<TargetType>::trace,
2039 HeapHashTableBacking<Table>::finalize, 2082 HeapHashTableBacking<Table>::finalize,
2040 Table::ValueTraits::needsDestruction, 2083 Table::ValueTraits::needsDestruction,
2041 WTF::IsPolymorphic<TargetType>::value, 2084 WTF::IsPolymorphic<TargetType>::value,
2042 #if ENABLE(GC_TRACING) 2085 #if ENABLE(GC_PROFILING)
2043 TypenameStringTrait<TargetType>::get() 2086 TypenameStringTrait<TargetType>::get()
2044 #endif 2087 #endif
2045 }; 2088 };
2046 return &info; 2089 return &info;
2047 } 2090 }
2048 }; 2091 };
2049 2092
2050 } // namespace blink 2093 } // namespace blink
2051 2094
2052 namespace WTF { 2095 namespace WTF {
(...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after
2376 }; 2419 };
2377 2420
2378 template<typename T> 2421 template<typename T>
2379 struct IfWeakMember<WeakMember<T> > { 2422 struct IfWeakMember<WeakMember<T> > {
2380 static bool isDead(Visitor* visitor, const WeakMember<T>& t) { return !visit or->isAlive(t.get()); } 2423 static bool isDead(Visitor* visitor, const WeakMember<T>& t) { return !visit or->isAlive(t.get()); }
2381 }; 2424 };
2382 2425
2383 } 2426 }
2384 2427
2385 #endif // Heap_h 2428 #endif // Heap_h
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698