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 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
88 #else | 88 #else |
89 #define FILL_ZERO_IF_PRODUCTION(address, size) memset((address), 0, (size)) | 89 #define FILL_ZERO_IF_PRODUCTION(address, size) memset((address), 0, (size)) |
90 #define FILL_ZERO_IF_NOT_PRODUCTION(address, size) do { } while (false) | 90 #define FILL_ZERO_IF_NOT_PRODUCTION(address, size) do { } while (false) |
91 #endif | 91 #endif |
92 | 92 |
93 class CallbackStack; | 93 class CallbackStack; |
94 class FreePagePool; | 94 class FreePagePool; |
95 class NormalPageHeap; | 95 class NormalPageHeap; |
96 class OrphanedPagePool; | 96 class OrphanedPagePool; |
97 class PageMemory; | 97 class PageMemory; |
98 class WebProcessMemoryDump; | |
98 | 99 |
99 #if ENABLE(GC_PROFILING) | 100 #if ENABLE(GC_PROFILING) |
100 class TracedValue; | 101 class TracedValue; |
101 #endif | 102 #endif |
102 | 103 |
103 // HeapObjectHeader is 4 byte (32 bit) that has the following layout: | 104 // HeapObjectHeader is 4 byte (32 bit) that has the following layout: |
104 // | 105 // |
105 // | gcInfoIndex (14 bit) | DOM mark bit (1 bit) | size (14 bit) | dead bit (1 b it) | freed bit (1 bit) | mark bit (1 bit) | | 106 // | gcInfoIndex (14 bit) | DOM mark bit (1 bit) | size (14 bit) | dead bit (1 b it) | freed bit (1 bit) | mark bit (1 bit) | |
106 // | 107 // |
107 // - For non-large objects, 14 bit is enough for |size| because the blink | 108 // - For non-large objects, 14 bit is enough for |size| because the blink |
(...skipping 571 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
679 // | 680 // |
680 // BaseHeap is a parent class of NormalPageHeap and LargeObjectHeap. | 681 // BaseHeap is a parent class of NormalPageHeap and LargeObjectHeap. |
681 // NormalPageHeap represents a heap that contains NormalPages | 682 // NormalPageHeap represents a heap that contains NormalPages |
682 // and LargeObjectHeap represents a heap that contains LargeObjectPages. | 683 // and LargeObjectHeap represents a heap that contains LargeObjectPages. |
683 class PLATFORM_EXPORT BaseHeap { | 684 class PLATFORM_EXPORT BaseHeap { |
684 public: | 685 public: |
685 BaseHeap(ThreadState*, int); | 686 BaseHeap(ThreadState*, int); |
686 virtual ~BaseHeap(); | 687 virtual ~BaseHeap(); |
687 void cleanupPages(); | 688 void cleanupPages(); |
688 | 689 |
690 void dumpMemory(const String& allocatorBaseName); | |
689 #if ENABLE(ASSERT) || ENABLE(GC_PROFILING) | 691 #if ENABLE(ASSERT) || ENABLE(GC_PROFILING) |
690 BasePage* findPageFromAddress(Address); | 692 BasePage* findPageFromAddress(Address); |
691 #endif | 693 #endif |
692 #if ENABLE(GC_PROFILING) | 694 #if ENABLE(GC_PROFILING) |
693 void snapshot(TracedValue*, ThreadState::SnapshotInfo*); | 695 void snapshot(TracedValue*, ThreadState::SnapshotInfo*); |
694 virtual void snapshotFreeList(TracedValue&) { }; | 696 virtual void snapshotFreeList(TracedValue&) { }; |
695 | 697 |
696 void countMarkedObjects(ClassAgeCountsMap&) const; | 698 void countMarkedObjects(ClassAgeCountsMap&) const; |
697 void countObjectsToSweep(ClassAgeCountsMap&) const; | 699 void countObjectsToSweep(ClassAgeCountsMap&) const; |
698 void incrementMarkedObjectsAge(); | 700 void incrementMarkedObjectsAge(); |
(...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
988 static void increaseAllocatedSpace(size_t delta) { atomicAdd(&s_allocatedSpa ce, static_cast<long>(delta)); } | 990 static void increaseAllocatedSpace(size_t delta) { atomicAdd(&s_allocatedSpa ce, static_cast<long>(delta)); } |
989 static void decreaseAllocatedSpace(size_t delta) { atomicSubtract(&s_allocat edSpace, static_cast<long>(delta)); } | 991 static void decreaseAllocatedSpace(size_t delta) { atomicSubtract(&s_allocat edSpace, static_cast<long>(delta)); } |
990 static size_t allocatedSpace() { return acquireLoad(&s_allocatedSpace); } | 992 static size_t allocatedSpace() { return acquireLoad(&s_allocatedSpace); } |
991 static size_t estimatedLiveObjectSize() { return acquireLoad(&s_estimatedLiv eObjectSize); } | 993 static size_t estimatedLiveObjectSize() { return acquireLoad(&s_estimatedLiv eObjectSize); } |
992 static void setEstimatedLiveObjectSize(size_t size) { releaseStore(&s_estima tedLiveObjectSize, size); } | 994 static void setEstimatedLiveObjectSize(size_t size) { releaseStore(&s_estima tedLiveObjectSize, size); } |
993 static size_t externalObjectSizeAtLastGC() { return acquireLoad(&s_externalO bjectSizeAtLastGC); } | 995 static size_t externalObjectSizeAtLastGC() { return acquireLoad(&s_externalO bjectSizeAtLastGC); } |
994 | 996 |
995 static double estimatedMarkingTime(); | 997 static double estimatedMarkingTime(); |
996 static void reportMemoryUsageHistogram(); | 998 static void reportMemoryUsageHistogram(); |
997 | 999 |
1000 static WebProcessMemoryDump* getLastProcessMemoryDump(); | |
Primiano Tucci (use gerrit)
2015/05/22 15:50:21
Hmm I think it would be cleaner if we keep the ext
ssid
2015/05/22 17:17:10
Done.
| |
1001 static void clearLastProcessMemoryDump(); | |
1002 | |
998 private: | 1003 private: |
999 // A RegionTree is a simple binary search tree of PageMemoryRegions sorted | 1004 // A RegionTree is a simple binary search tree of PageMemoryRegions sorted |
1000 // by base addresses. | 1005 // by base addresses. |
1001 class RegionTree { | 1006 class RegionTree { |
1002 public: | 1007 public: |
1003 explicit RegionTree(PageMemoryRegion* region) : m_region(region), m_left (nullptr), m_right(nullptr) { } | 1008 explicit RegionTree(PageMemoryRegion* region) : m_region(region), m_left (nullptr), m_right(nullptr) { } |
1004 ~RegionTree() | 1009 ~RegionTree() |
1005 { | 1010 { |
1006 delete m_left; | 1011 delete m_left; |
1007 delete m_right; | 1012 delete m_right; |
(...skipping 20 matching lines...) Expand all Loading... | |
1028 static bool s_lastGCWasConservative; | 1033 static bool s_lastGCWasConservative; |
1029 static FreePagePool* s_freePagePool; | 1034 static FreePagePool* s_freePagePool; |
1030 static OrphanedPagePool* s_orphanedPagePool; | 1035 static OrphanedPagePool* s_orphanedPagePool; |
1031 static RegionTree* s_regionTree; | 1036 static RegionTree* s_regionTree; |
1032 static size_t s_allocatedSpace; | 1037 static size_t s_allocatedSpace; |
1033 static size_t s_allocatedObjectSize; | 1038 static size_t s_allocatedObjectSize; |
1034 static size_t s_markedObjectSize; | 1039 static size_t s_markedObjectSize; |
1035 static size_t s_estimatedLiveObjectSize; | 1040 static size_t s_estimatedLiveObjectSize; |
1036 static size_t s_externalObjectSizeAtLastGC; | 1041 static size_t s_externalObjectSizeAtLastGC; |
1037 static double s_estimatedMarkingTimePerByte; | 1042 static double s_estimatedMarkingTimePerByte; |
1043 static WebProcessMemoryDump* s_lastProcessMemoryDump; | |
Primiano Tucci (use gerrit)
2015/05/22 15:50:21
Same here, if you move the WPMD to the GCDumpprovi
ssid
2015/05/22 17:17:10
Done.
| |
1038 | 1044 |
1039 friend class ThreadState; | 1045 friend class ThreadState; |
1040 }; | 1046 }; |
1041 | 1047 |
1042 template<typename T> class GarbageCollected { | 1048 template<typename T> class GarbageCollected { |
1043 WTF_MAKE_NONCOPYABLE(GarbageCollected); | 1049 WTF_MAKE_NONCOPYABLE(GarbageCollected); |
1044 | 1050 |
1045 // For now direct allocation of arrays on the heap is not allowed. | 1051 // For now direct allocation of arrays on the heap is not allowed. |
1046 void* operator new[](size_t size); | 1052 void* operator new[](size_t size); |
1047 | 1053 |
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1273 size_t copySize = previousHeader->payloadSize(); | 1279 size_t copySize = previousHeader->payloadSize(); |
1274 if (copySize > size) | 1280 if (copySize > size) |
1275 copySize = size; | 1281 copySize = size; |
1276 memcpy(address, previous, copySize); | 1282 memcpy(address, previous, copySize); |
1277 return address; | 1283 return address; |
1278 } | 1284 } |
1279 | 1285 |
1280 } // namespace blink | 1286 } // namespace blink |
1281 | 1287 |
1282 #endif // Heap_h | 1288 #endif // Heap_h |
OLD | NEW |