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

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

Issue 717923005: Profile FreeList Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 years 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 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
74 // The dead bit is used for objects that have gone through a GC marking, but did 74 // The dead bit is used for objects that have gone through a GC marking, but did
75 // not get swept before a new GC started. In that case we set the dead bit on 75 // not get swept before a new GC started. In that case we set the dead bit on
76 // objects that were not marked in the previous GC to ensure we are not tracing 76 // objects that were not marked in the previous GC to ensure we are not tracing
77 // them via a conservatively found pointer. Tracing dead objects could lead to 77 // them via a conservatively found pointer. Tracing dead objects could lead to
78 // tracing of already finalized objects in another thread's heap which is a 78 // tracing of already finalized objects in another thread's heap which is a
79 // use-after-free situation. 79 // use-after-free situation.
80 const size_t deadBitMask = 4; 80 const size_t deadBitMask = 4;
81 // On free-list entries we reuse the dead bit to distinguish a normal free-list 81 // On free-list entries we reuse the dead bit to distinguish a normal free-list
82 // entry from one that has been promptly freed. 82 // entry from one that has been promptly freed.
83 const size_t promptlyFreedMask = freeListMask | deadBitMask; 83 const size_t promptlyFreedMask = freeListMask | deadBitMask;
84 #if ENABLE(GC_PROFILE_HEAP) 84 //#if ENABLE(GC_PROFILE_HEAP)
85 const size_t heapObjectGenerations = 8; 85 const size_t heapObjectGenerations = 8;
86 const size_t maxHeapObjectAge = heapObjectGenerations - 1; 86 const size_t maxHeapObjectAge = heapObjectGenerations - 1;
87 const size_t heapObjectAgeMask = ~(maxHeapObjectSize - 1); 87 const size_t heapObjectAgeMask = ~(maxHeapObjectSize - 1);
88 const size_t sizeMask = ~heapObjectAgeMask & ~static_cast<size_t>(7); 88 const size_t sizeMask = ~heapObjectAgeMask & ~static_cast<size_t>(7);
89 #else 89 //#else
90 const size_t sizeMask = ~static_cast<size_t>(7); 90 //const size_t sizeMask = ~static_cast<size_t>(7);
91 #endif 91 //#endif
92 const uint8_t freelistZapValue = 42; 92 const uint8_t freelistZapValue = 42;
93 const uint8_t finalizedZapValue = 24; 93 const uint8_t finalizedZapValue = 24;
94 // The orphaned zap value must be zero in the lowest bits to allow for using 94 // The orphaned zap value must be zero in the lowest bits to allow for using
95 // the mark bit when tracing. 95 // the mark bit when tracing.
96 const uint8_t orphanedZapValue = 240; 96 const uint8_t orphanedZapValue = 240;
97 const int numberOfPagesToConsiderForCoalescing = 100; 97 const int numberOfPagesToConsiderForCoalescing = 100;
98 98
99 enum CallbackInvocationMode { 99 enum CallbackInvocationMode {
100 GlobalMarking, 100 GlobalMarking,
101 ThreadLocalMarking, 101 ThreadLocalMarking,
102 }; 102 };
103 103
104 class CallbackStack; 104 class CallbackStack;
105 class PageMemory; 105 class PageMemory;
106 template<ThreadAffinity affinity> class ThreadLocalPersistents; 106 template<ThreadAffinity affinity> class ThreadLocalPersistents;
107 template<typename T, typename RootsAccessor = ThreadLocalPersistents<ThreadingTr ait<T>::Affinity > > class Persistent; 107 template<typename T, typename RootsAccessor = ThreadLocalPersistents<ThreadingTr ait<T>::Affinity > > class Persistent;
108 108
109 #if ENABLE(GC_PROFILE_HEAP) 109 #if ENABLE(GC_PROFILE_HEAP) || ENABLE(GC_PROFILE_FREE_LIST)
110 class TracedValue; 110 class TracedValue;
111 #endif 111 #endif
112 112
113 PLATFORM_EXPORT size_t osPageSize(); 113 PLATFORM_EXPORT size_t osPageSize();
114 114
115 // Blink heap pages are set up with a guard page before and after the 115 // Blink heap pages are set up with a guard page before and after the
116 // payload. 116 // payload.
117 inline size_t blinkPagePayloadSize() 117 inline size_t blinkPagePayloadSize()
118 { 118 {
119 return blinkPageSize - 2 * osPageSize(); 119 return blinkPageSize - 2 * osPageSize();
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after
285 285
286 NO_SANITIZE_ADDRESS 286 NO_SANITIZE_ADDRESS
287 void markPromptlyFreed() { m_size |= promptlyFreedMask; } 287 void markPromptlyFreed() { m_size |= promptlyFreedMask; }
288 288
289 NO_SANITIZE_ADDRESS 289 NO_SANITIZE_ADDRESS
290 size_t size() const { return m_size & sizeMask; } 290 size_t size() const { return m_size & sizeMask; }
291 291
292 NO_SANITIZE_ADDRESS 292 NO_SANITIZE_ADDRESS
293 void setSize(size_t size) { m_size = (size | (m_size & ~sizeMask)); } 293 void setSize(size_t size) { m_size = (size | (m_size & ~sizeMask)); }
294 294
295 #if ENABLE(GC_PROFILE_HEAP) 295 //#if ENABLE(GC_PROFILE_HEAP)
296 NO_SANITIZE_ADDRESS 296 NO_SANITIZE_ADDRESS
297 size_t encodedSize() const { return m_size; } 297 size_t encodedSize() const { return m_size; }
298 298
299 NO_SANITIZE_ADDRESS 299 NO_SANITIZE_ADDRESS
300 size_t age() const { return m_size >> maxHeapObjectSizeLog2; } 300 size_t age() const { return m_size >> maxHeapObjectSizeLog2; }
301 301
302 NO_SANITIZE_ADDRESS 302 NO_SANITIZE_ADDRESS
303 void incAge() 303 void incAge()
304 { 304 {
305 size_t current = age(); 305 size_t current = age();
306 if (current < maxHeapObjectAge) 306 if (current < maxHeapObjectAge)
307 m_size = ((current + 1) << maxHeapObjectSizeLog2) | (m_size & ~heapO bjectAgeMask); 307 m_size = ((current + 1) << maxHeapObjectSizeLog2) | (m_size & ~heapO bjectAgeMask);
308 } 308 }
309 #endif 309 //#endif
310 310
311 protected: 311 protected:
312 volatile unsigned m_size; 312 volatile unsigned m_size;
313 }; 313 };
314 314
315 // Our heap object layout is layered with the HeapObjectHeader closest 315 // Our heap object layout is layered with the HeapObjectHeader closest
316 // to the payload, this can be wrapped in a FinalizedObjectHeader if the 316 // to the payload, this can be wrapped in a FinalizedObjectHeader if the
317 // object is on the GeneralHeap and not on a specific TypedHeap. 317 // object is on the GeneralHeap and not on a specific TypedHeap.
318 // Finally if the object is a large object (> blinkPageSize/2) then it is 318 // Finally if the object is a large object (> blinkPageSize/2) then it is
319 // wrapped with a LargeObjectHeader. 319 // wrapped with a LargeObjectHeader.
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after
527 void clearObjectStartBitMap(); 527 void clearObjectStartBitMap();
528 void finalize(Header*); 528 void finalize(Header*);
529 virtual void checkAndMarkPointer(Visitor*, Address) override; 529 virtual void checkAndMarkPointer(Visitor*, Address) override;
530 #if ENABLE(GC_PROFILE_MARKING) 530 #if ENABLE(GC_PROFILE_MARKING)
531 const GCInfo* findGCInfo(Address) override; 531 const GCInfo* findGCInfo(Address) override;
532 #endif 532 #endif
533 #if ENABLE(GC_PROFILE_HEAP) 533 #if ENABLE(GC_PROFILE_HEAP)
534 virtual void snapshot(TracedValue*, ThreadState::SnapshotInfo*); 534 virtual void snapshot(TracedValue*, ThreadState::SnapshotInfo*);
535 #endif 535 #endif
536 536
537 void countUnmarkedObjects();
538
537 #if defined(ADDRESS_SANITIZER) 539 #if defined(ADDRESS_SANITIZER)
538 void poisonUnmarkedObjects(); 540 void poisonUnmarkedObjects();
539 #endif 541 #endif
540 NO_SANITIZE_ADDRESS 542 NO_SANITIZE_ADDRESS
541 virtual void markOrphaned() override 543 virtual void markOrphaned() override
542 { 544 {
543 // Zap the payload with a recognizable value to detect any incorrect 545 // Zap the payload with a recognizable value to detect any incorrect
544 // cross thread pointer usage. 546 // cross thread pointer usage.
545 #if defined(ADDRESS_SANITIZER) 547 #if defined(ADDRESS_SANITIZER)
546 // Don't use memset when running with ASan since this needs to zap 548 // Don't use memset when running with ASan since this needs to zap
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
677 679
678 // Find the page in this thread heap containing the given 680 // Find the page in this thread heap containing the given
679 // address. Returns 0 if the address is not contained in any 681 // address. Returns 0 if the address is not contained in any
680 // page in this thread heap. 682 // page in this thread heap.
681 virtual BaseHeapPage* pageFromAddress(Address) = 0; 683 virtual BaseHeapPage* pageFromAddress(Address) = 0;
682 684
683 #if ENABLE(GC_PROFILE_MARKING) 685 #if ENABLE(GC_PROFILE_MARKING)
684 virtual const GCInfo* findGCInfoOfLargeObject(Address) = 0; 686 virtual const GCInfo* findGCInfoOfLargeObject(Address) = 0;
685 #endif 687 #endif
686 688
689 #if ENABLE(GC_PROFILE_FREE_LIST)
690 virtual void snapshotFreeList(TracedValue*) = 0;
691 #endif
692
687 #if ENABLE(GC_PROFILE_HEAP) 693 #if ENABLE(GC_PROFILE_HEAP)
688 virtual void snapshot(TracedValue*, ThreadState::SnapshotInfo*) = 0; 694 virtual void snapshot(TracedValue*, ThreadState::SnapshotInfo*) = 0;
689 #endif 695 #endif
690 696
691 // Sweep this part of the Blink heap. This finalizes dead objects 697 // Sweep this part of the Blink heap. This finalizes dead objects
692 // and builds freelists for all the unused memory. 698 // and builds freelists for all the unused memory.
693 virtual void sweep() = 0; 699 virtual void sweep() = 0;
694 virtual void postSweepProcessing() = 0; 700 virtual void postSweepProcessing() = 0;
695 701
696 virtual void clearFreeLists() = 0; 702 virtual void clearFreeLists() = 0;
(...skipping 13 matching lines...) Expand all
710 }; 716 };
711 717
712 template<typename Header> 718 template<typename Header>
713 class FreeList { 719 class FreeList {
714 public: 720 public:
715 FreeList(); 721 FreeList();
716 722
717 void addToFreeList(Address, size_t); 723 void addToFreeList(Address, size_t);
718 void clear(); 724 void clear();
719 725
726 #if ENABLE(GC_PROFILE_FREE_LIST)
727 void countBucketSizes(size_t[], size_t[], size_t* freeSize) const;
728 #endif
729
720 private: 730 private:
721 // Returns a bucket number for inserting a FreeListEntry of a 731 // Returns a bucket number for inserting a FreeListEntry of a
722 // given size. All FreeListEntries in the given bucket, n, have 732 // given size. All FreeListEntries in the given bucket, n, have
723 // size >= 2^n. 733 // size >= 2^n.
724 static int bucketIndexForSize(size_t); 734 static int bucketIndexForSize(size_t);
725 735
726 int m_biggestFreeListIndex; 736 int m_biggestFreeListIndex;
727 737
728 // All FreeListEntries in the nth list have size >= 2^n. 738 // All FreeListEntries in the nth list have size >= 2^n.
729 FreeListEntry* m_freeLists[blinkPageSizeLog2]; 739 FreeListEntry* m_freeLists[blinkPageSizeLog2];
(...skipping 16 matching lines...) Expand all
746 class ThreadHeap : public BaseHeap { 756 class ThreadHeap : public BaseHeap {
747 public: 757 public:
748 ThreadHeap(ThreadState*, int); 758 ThreadHeap(ThreadState*, int);
749 virtual ~ThreadHeap(); 759 virtual ~ThreadHeap();
750 virtual void cleanupPages() override; 760 virtual void cleanupPages() override;
751 761
752 virtual BaseHeapPage* pageFromAddress(Address) override; 762 virtual BaseHeapPage* pageFromAddress(Address) override;
753 #if ENABLE(GC_PROFILE_MARKING) 763 #if ENABLE(GC_PROFILE_MARKING)
754 virtual const GCInfo* findGCInfoOfLargeObject(Address) override; 764 virtual const GCInfo* findGCInfoOfLargeObject(Address) override;
755 #endif 765 #endif
766 #if ENABLE(GC_PROFILE_FREE_LIST)
767 virtual void snapshotFreeList(TracedValue*) override;
768 #endif
756 #if ENABLE(GC_PROFILE_HEAP) 769 #if ENABLE(GC_PROFILE_HEAP)
757 virtual void snapshot(TracedValue*, ThreadState::SnapshotInfo*) override; 770 virtual void snapshot(TracedValue*, ThreadState::SnapshotInfo*) override;
758 #endif 771 #endif
759 772
760 virtual void sweep() override; 773 virtual void sweep() override;
761 virtual void postSweepProcessing() override; 774 virtual void postSweepProcessing() override;
762 775
763 virtual void clearFreeLists() override; 776 virtual void clearFreeLists() override;
764 virtual void markUnmarkedObjectsDead() override; 777 virtual void markUnmarkedObjectsDead() override;
765 778
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
798 private: 811 private:
799 void addPageToHeap(const GCInfo*); 812 void addPageToHeap(const GCInfo*);
800 PLATFORM_EXPORT Address outOfLineAllocate(size_t payloadSize, size_t allocat ionSize, const GCInfo*); 813 PLATFORM_EXPORT Address outOfLineAllocate(size_t payloadSize, size_t allocat ionSize, const GCInfo*);
801 static size_t allocationSizeFromSize(size_t); 814 static size_t allocationSizeFromSize(size_t);
802 PLATFORM_EXPORT Address allocateLargeObject(size_t, const GCInfo*); 815 PLATFORM_EXPORT Address allocateLargeObject(size_t, const GCInfo*);
803 Address currentAllocationPoint() const { return m_currentAllocationPoint; } 816 Address currentAllocationPoint() const { return m_currentAllocationPoint; }
804 size_t remainingAllocationSize() const { return m_remainingAllocationSize; } 817 size_t remainingAllocationSize() const { return m_remainingAllocationSize; }
805 bool ownsNonEmptyAllocationArea() const { return currentAllocationPoint() && remainingAllocationSize(); } 818 bool ownsNonEmptyAllocationArea() const { return currentAllocationPoint() && remainingAllocationSize(); }
806 void setAllocationPoint(Address point, size_t size) 819 void setAllocationPoint(Address point, size_t size)
807 { 820 {
821 #if ENABLE(GC_PROFILE_FREE_LIST)
822 m_allocationPointSizeSum += size;
823 ++m_setAllocationPointCount;
824 #endif
808 ASSERT(!point || pageFromAddress(point)); 825 ASSERT(!point || pageFromAddress(point));
809 ASSERT(size <= HeapPage<Header>::payloadSize()); 826 ASSERT(size <= HeapPage<Header>::payloadSize());
810 updateRemainingAllocationSize(); 827 updateRemainingAllocationSize();
811 m_currentAllocationPoint = point; 828 m_currentAllocationPoint = point;
812 m_lastRemainingAllocationSize = m_remainingAllocationSize = size; 829 m_lastRemainingAllocationSize = m_remainingAllocationSize = size;
813 } 830 }
814 void ensureCurrentAllocation(size_t, const GCInfo*); 831 void ensureCurrentAllocation(size_t, const GCInfo*);
815 bool allocateFromFreeList(size_t); 832 bool allocateFromFreeList(size_t);
816 833
817 void freeLargeObject(LargeObject<Header>*, LargeObject<Header>**); 834 void freeLargeObject(LargeObject<Header>*, LargeObject<Header>**);
818 void allocatePage(const GCInfo*); 835 void allocatePage(const GCInfo*);
819 836
820 #if ENABLE(ASSERT) 837 #if ENABLE(ASSERT)
821 bool pagesToBeSweptContains(Address); 838 bool pagesToBeSweptContains(Address);
822 bool pagesAllocatedDuringSweepingContains(Address); 839 bool pagesAllocatedDuringSweepingContains(Address);
823 #endif 840 #endif
824 841
825 void sweepNormalPages(); 842 void sweepNormalPages();
826 void sweepLargePages(); 843 void sweepLargePages();
827 bool coalesce(size_t); 844 bool coalesce(size_t);
828 845
829 Address m_currentAllocationPoint; 846 Address m_currentAllocationPoint;
830 size_t m_remainingAllocationSize; 847 size_t m_remainingAllocationSize;
831 size_t m_lastRemainingAllocationSize; 848 size_t m_lastRemainingAllocationSize;
832 849
850 double m_totalAllocationSize;
851 size_t m_allocationCount;
852 size_t m_inlineAllocationCount;
853
833 HeapPage<Header>* m_firstPage; 854 HeapPage<Header>* m_firstPage;
834 LargeObject<Header>* m_firstLargeObject; 855 LargeObject<Header>* m_firstLargeObject;
835 856
836 HeapPage<Header>* m_firstPageAllocatedDuringSweeping; 857 HeapPage<Header>* m_firstPageAllocatedDuringSweeping;
837 HeapPage<Header>* m_lastPageAllocatedDuringSweeping; 858 HeapPage<Header>* m_lastPageAllocatedDuringSweeping;
838 859
839 LargeObject<Header>* m_firstLargeObjectAllocatedDuringSweeping; 860 LargeObject<Header>* m_firstLargeObjectAllocatedDuringSweeping;
840 LargeObject<Header>* m_lastLargeObjectAllocatedDuringSweeping; 861 LargeObject<Header>* m_lastLargeObjectAllocatedDuringSweeping;
841 862
842 ThreadState* m_threadState; 863 ThreadState* m_threadState;
843 864
844 FreeList<Header> m_freeList; 865 FreeList<Header> m_freeList;
845 866
846 // Index into the page pools. This is used to ensure that the pages of the 867 // Index into the page pools. This is used to ensure that the pages of the
847 // same type go into the correct page pool and thus avoid type confusion. 868 // same type go into the correct page pool and thus avoid type confusion.
848 int m_index; 869 int m_index;
849 870
850 int m_numberOfNormalPages; 871 int m_numberOfNormalPages;
851 872
852 // The promptly freed count contains the number of promptly freed objects 873 // The promptly freed count contains the number of promptly freed objects
853 // since the last sweep or since it was manually reset to delay coalescing. 874 // since the last sweep or since it was manually reset to delay coalescing.
854 size_t m_promptlyFreedCount; 875 size_t m_promptlyFreedCount;
876
877 #if ENABLE(GC_PROFILE_FREE_LIST)
878 size_t m_allocationPointSizeSum = 0;
879 size_t m_setAllocationPointCount = 0;
880 #endif
855 }; 881 };
856 882
857 class PLATFORM_EXPORT Heap { 883 class PLATFORM_EXPORT Heap {
858 public: 884 public:
859 static void init(); 885 static void init();
860 static void shutdown(); 886 static void shutdown();
861 static void doShutdown(); 887 static void doShutdown();
862 888
863 static BaseHeapPage* contains(Address); 889 static BaseHeapPage* contains(Address);
864 static BaseHeapPage* contains(void* pointer) { return contains(reinterpret_c ast<Address>(pointer)); } 890 static BaseHeapPage* contains(void* pointer) { return contains(reinterpret_c ast<Address>(pointer)); }
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
918 static void collectGarbage(ThreadState::StackState, ThreadState::CauseOfGC = ThreadState::NormalGC); 944 static void collectGarbage(ThreadState::StackState, ThreadState::CauseOfGC = ThreadState::NormalGC);
919 static void collectGarbageForTerminatingThread(ThreadState*); 945 static void collectGarbageForTerminatingThread(ThreadState*);
920 static void collectAllGarbage(); 946 static void collectAllGarbage();
921 template<CallbackInvocationMode Mode> static void processMarkingStack(); 947 template<CallbackInvocationMode Mode> static void processMarkingStack();
922 static void postMarkingProcessing(); 948 static void postMarkingProcessing();
923 static void globalWeakProcessing(); 949 static void globalWeakProcessing();
924 static void setForcePreciseGCForTesting(); 950 static void setForcePreciseGCForTesting();
925 951
926 static void prepareForGC(); 952 static void prepareForGC();
927 953
954 static void reportSweepingStats();
955
928 // Conservatively checks whether an address is a pointer in any of the threa d 956 // Conservatively checks whether an address is a pointer in any of the threa d
929 // heaps. If so marks the object pointed to as live. 957 // heaps. If so marks the object pointed to as live.
930 static Address checkAndMarkPointer(Visitor*, Address); 958 static Address checkAndMarkPointer(Visitor*, Address);
931 959
932 #if ENABLE(GC_PROFILE_MARKING) 960 #if ENABLE(GC_PROFILE_MARKING)
933 // Dump the path to specified object on the next GC. This method is to be in voked from GDB. 961 // Dump the path to specified object on the next GC. This method is to be in voked from GDB.
934 static void dumpPathToObjectOnNextGC(void* p); 962 static void dumpPathToObjectOnNextGC(void* p);
935 963
936 // Forcibly find GCInfo of the object at Address. 964 // Forcibly find GCInfo of the object at Address.
937 // This is slow and should only be used for debug purposes. 965 // This is slow and should only be used for debug purposes.
(...skipping 395 matching lines...) Expand 10 before | Expand all | Expand 10 after
1333 // Add space for header. 1361 // Add space for header.
1334 size_t allocationSize = size + sizeof(Header); 1362 size_t allocationSize = size + sizeof(Header);
1335 // Align size with allocation granularity. 1363 // Align size with allocation granularity.
1336 allocationSize = (allocationSize + allocationMask) & ~allocationMask; 1364 allocationSize = (allocationSize + allocationMask) & ~allocationMask;
1337 return allocationSize; 1365 return allocationSize;
1338 } 1366 }
1339 1367
1340 template<typename Header> 1368 template<typename Header>
1341 Address ThreadHeap<Header>::allocate(size_t size, const GCInfo* gcInfo) 1369 Address ThreadHeap<Header>::allocate(size_t size, const GCInfo* gcInfo)
1342 { 1370 {
1371 m_totalAllocationSize += size;
1372 m_allocationCount++;
1343 size_t allocationSize = allocationSizeFromSize(size); 1373 size_t allocationSize = allocationSizeFromSize(size);
1344 if (LIKELY(allocationSize <= m_remainingAllocationSize)) { 1374 if (LIKELY(allocationSize <= m_remainingAllocationSize)) {
1375 m_inlineAllocationCount++;
1345 Address headerAddress = m_currentAllocationPoint; 1376 Address headerAddress = m_currentAllocationPoint;
1346 m_currentAllocationPoint += allocationSize; 1377 m_currentAllocationPoint += allocationSize;
1347 m_remainingAllocationSize -= allocationSize; 1378 m_remainingAllocationSize -= allocationSize;
1348 new (NotNull, headerAddress) Header(allocationSize, gcInfo); 1379 new (NotNull, headerAddress) Header(allocationSize, gcInfo);
1349 Address result = headerAddress + sizeof(Header); 1380 Address result = headerAddress + sizeof(Header);
1350 ASSERT(!(reinterpret_cast<uintptr_t>(result) & allocationMask)); 1381 ASSERT(!(reinterpret_cast<uintptr_t>(result) & allocationMask));
1351 1382
1352 // Unpoison the memory used for the object (payload). 1383 // Unpoison the memory used for the object (payload).
1353 ASAN_UNPOISON_MEMORY_REGION(result, allocationSize - sizeof(Header)); 1384 ASAN_UNPOISON_MEMORY_REGION(result, allocationSize - sizeof(Header));
1354 #if ENABLE(ASSERT) || defined(LEAK_SANITIZER) || defined(ADDRESS_SANITIZER) 1385 #if ENABLE(ASSERT) || defined(LEAK_SANITIZER) || defined(ADDRESS_SANITIZER)
(...skipping 997 matching lines...) Expand 10 before | Expand all | Expand 10 after
2352 template<typename T, size_t inlineCapacity> 2383 template<typename T, size_t inlineCapacity>
2353 struct GCInfoTrait<HeapVector<T, inlineCapacity> > : public GCInfoTrait<Vector<T , inlineCapacity, HeapAllocator> > { }; 2384 struct GCInfoTrait<HeapVector<T, inlineCapacity> > : public GCInfoTrait<Vector<T , inlineCapacity, HeapAllocator> > { };
2354 template<typename T, size_t inlineCapacity> 2385 template<typename T, size_t inlineCapacity>
2355 struct GCInfoTrait<HeapDeque<T, inlineCapacity> > : public GCInfoTrait<Deque<T, inlineCapacity, HeapAllocator> > { }; 2386 struct GCInfoTrait<HeapDeque<T, inlineCapacity> > : public GCInfoTrait<Deque<T, inlineCapacity, HeapAllocator> > { };
2356 template<typename T, typename U, typename V> 2387 template<typename T, typename U, typename V>
2357 struct GCInfoTrait<HeapHashCountedSet<T, U, V> > : public GCInfoTrait<HashCounte dSet<T, U, V, HeapAllocator> > { }; 2388 struct GCInfoTrait<HeapHashCountedSet<T, U, V> > : public GCInfoTrait<HashCounte dSet<T, U, V, HeapAllocator> > { };
2358 2389
2359 } // namespace blink 2390 } // namespace blink
2360 2391
2361 #endif // Heap_h 2392 #endif // Heap_h
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698