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 16 matching lines...) Expand all Loading... | |
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
29 */ | 29 */ |
30 | 30 |
31 #ifndef ThreadState_h | 31 #ifndef ThreadState_h |
32 #define ThreadState_h | 32 #define ThreadState_h |
33 | 33 |
34 #include "platform/PlatformExport.h" | 34 #include "platform/PlatformExport.h" |
35 #include "platform/heap/AddressSanitizer.h" | 35 #include "platform/heap/AddressSanitizer.h" |
36 #include "platform/heap/ThreadingTraits.h" | 36 #include "platform/heap/ThreadingTraits.h" |
37 #include "public/platform/WebMemoryDumpProvider.h" | |
37 #include "public/platform/WebThread.h" | 38 #include "public/platform/WebThread.h" |
38 #include "wtf/Forward.h" | 39 #include "wtf/Forward.h" |
39 #include "wtf/HashMap.h" | 40 #include "wtf/HashMap.h" |
40 #include "wtf/HashSet.h" | 41 #include "wtf/HashSet.h" |
41 #include "wtf/PassOwnPtr.h" | 42 #include "wtf/PassOwnPtr.h" |
42 #include "wtf/ThreadSpecific.h" | 43 #include "wtf/ThreadSpecific.h" |
43 #include "wtf/Threading.h" | 44 #include "wtf/Threading.h" |
44 #include "wtf/ThreadingPrimitives.h" | 45 #include "wtf/ThreadingPrimitives.h" |
45 #include "wtf/text/WTFString.h" | 46 #include "wtf/text/WTFString.h" |
46 | 47 |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
157 const size_t numberOfGenerationsToTrack = 8; | 158 const size_t numberOfGenerationsToTrack = 8; |
158 const size_t maxHeapObjectAge = numberOfGenerationsToTrack - 1; | 159 const size_t maxHeapObjectAge = numberOfGenerationsToTrack - 1; |
159 | 160 |
160 struct AgeCounts { | 161 struct AgeCounts { |
161 int ages[numberOfGenerationsToTrack]; | 162 int ages[numberOfGenerationsToTrack]; |
162 AgeCounts() { std::fill(ages, ages + numberOfGenerationsToTrack, 0); } | 163 AgeCounts() { std::fill(ages, ages + numberOfGenerationsToTrack, 0); } |
163 }; | 164 }; |
164 typedef HashMap<String, AgeCounts> ClassAgeCountsMap; | 165 typedef HashMap<String, AgeCounts> ClassAgeCountsMap; |
165 #endif | 166 #endif |
166 | 167 |
167 class PLATFORM_EXPORT ThreadState { | 168 class PLATFORM_EXPORT ThreadState : public WebMemoryDumpProvider { |
Primiano Tucci (use gerrit)
2015/05/21 18:43:10
We discussed this offline (there is a thread in th
ssid
2015/05/22 13:34:07
Done.
| |
168 WTF_MAKE_NONCOPYABLE(ThreadState); | 169 WTF_MAKE_NONCOPYABLE(ThreadState); |
169 public: | 170 public: |
170 // When garbage collecting we need to know whether or not there | 171 // When garbage collecting we need to know whether or not there |
171 // can be pointers to Blink GC managed objects on the stack for | 172 // can be pointers to Blink GC managed objects on the stack for |
172 // each thread. When threads reach a safe point they record | 173 // each thread. When threads reach a safe point they record |
173 // whether or not they have pointers on the stack. | 174 // whether or not they have pointers on the stack. |
174 enum StackState { | 175 enum StackState { |
175 NoHeapPointersOnStack, | 176 NoHeapPointersOnStack, |
176 HeapPointersOnStack | 177 HeapPointersOnStack |
177 }; | 178 }; |
(...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
450 // Visit local thread stack and trace all pointers conservatively. | 451 // Visit local thread stack and trace all pointers conservatively. |
451 void visitStack(Visitor*); | 452 void visitStack(Visitor*); |
452 | 453 |
453 // Visit the asan fake stack frame corresponding to a slot on the | 454 // Visit the asan fake stack frame corresponding to a slot on the |
454 // real machine stack if there is one. | 455 // real machine stack if there is one. |
455 void visitAsanFakeStackForPointer(Visitor*, Address); | 456 void visitAsanFakeStackForPointer(Visitor*, Address); |
456 | 457 |
457 // Visit all persistents allocated on this thread. | 458 // Visit all persistents allocated on this thread. |
458 void visitPersistents(Visitor*); | 459 void visitPersistents(Visitor*); |
459 | 460 |
461 // Takes dump of memory statistics when tracing is enabled with memory | |
462 // category. | |
463 void dumpMemoryIfNecessary(); | |
Primiano Tucci (use gerrit)
2015/05/21 18:43:10
Had a second thought about this, please don't hate
ssid
2015/05/22 13:34:07
Haha now there is no need to think about it. :) Pe
| |
464 | |
460 #if ENABLE(GC_PROFILING) | 465 #if ENABLE(GC_PROFILING) |
461 const GCInfo* findGCInfo(Address); | 466 const GCInfo* findGCInfo(Address); |
462 static const GCInfo* findGCInfoFromAllThreads(Address); | 467 static const GCInfo* findGCInfoFromAllThreads(Address); |
463 | 468 |
464 struct SnapshotInfo { | 469 struct SnapshotInfo { |
465 ThreadState* state; | 470 ThreadState* state; |
466 | 471 |
467 size_t freeSize; | 472 size_t freeSize; |
468 size_t pageCount; | 473 size_t pageCount; |
469 | 474 |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
602 return m_heaps[heapIndex]; | 607 return m_heaps[heapIndex]; |
603 } | 608 } |
604 BaseHeap* expandedVectorBackingHeap(size_t gcInfoIndex); | 609 BaseHeap* expandedVectorBackingHeap(size_t gcInfoIndex); |
605 static bool isVectorHeapIndex(int heapIndex) | 610 static bool isVectorHeapIndex(int heapIndex) |
606 { | 611 { |
607 return Vector1HeapIndex <= heapIndex && heapIndex <= Vector4HeapIndex; | 612 return Vector1HeapIndex <= heapIndex && heapIndex <= Vector4HeapIndex; |
608 } | 613 } |
609 void allocationPointAdjusted(int heapIndex); | 614 void allocationPointAdjusted(int heapIndex); |
610 void promptlyFreed(size_t gcInfoIndex); | 615 void promptlyFreed(size_t gcInfoIndex); |
611 | 616 |
617 // WebMemoryDumpProvider implementation. | |
618 bool onMemoryDump(WebProcessMemoryDump*) override; | |
Primiano Tucci (use gerrit)
2015/05/21 18:43:10
This should go away from here, as per discussion u
ssid
2015/05/22 13:34:07
Done.
| |
619 | |
612 private: | 620 private: |
613 ThreadState(); | 621 ThreadState(); |
614 ~ThreadState(); | 622 ~ThreadState(); |
615 | 623 |
616 void enterSafePoint(StackState, void*); | 624 void enterSafePoint(StackState, void*); |
617 NO_SANITIZE_ADDRESS void copyStackUntilSafePointScope(); | 625 NO_SANITIZE_ADDRESS void copyStackUntilSafePointScope(); |
618 void clearSafePointScopeMarker() | 626 void clearSafePointScopeMarker() |
619 { | 627 { |
620 m_safePointStackCopy.clear(); | 628 m_safePointStackCopy.clear(); |
621 m_safePointScopeMarker = nullptr; | 629 m_safePointScopeMarker = nullptr; |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
699 | 707 |
700 v8::Isolate* m_isolate; | 708 v8::Isolate* m_isolate; |
701 void (*m_traceDOMWrappers)(v8::Isolate*, Visitor*); | 709 void (*m_traceDOMWrappers)(v8::Isolate*, Visitor*); |
702 | 710 |
703 #if defined(ADDRESS_SANITIZER) | 711 #if defined(ADDRESS_SANITIZER) |
704 void* m_asanFakeStack; | 712 void* m_asanFakeStack; |
705 #endif | 713 #endif |
706 | 714 |
707 Vector<PageMemoryRegion*> m_allocatedRegionsSinceLastGC; | 715 Vector<PageMemoryRegion*> m_allocatedRegionsSinceLastGC; |
708 | 716 |
717 OwnPtr<WebProcessMemoryDump> m_lastProcessMemoryDump; | |
Primiano Tucci (use gerrit)
2015/05/21 18:43:10
And this should be just one, shared by all the Thr
ssid
2015/05/22 13:34:07
Done.
| |
718 | |
709 #if ENABLE(GC_PROFILING) | 719 #if ENABLE(GC_PROFILING) |
710 double m_nextFreeListSnapshotTime; | 720 double m_nextFreeListSnapshotTime; |
711 #endif | 721 #endif |
712 // Ideally we want to allocate an array of size |gcInfoTableMax| but it will | 722 // Ideally we want to allocate an array of size |gcInfoTableMax| but it will |
713 // waste memory. Thus we limit the array size to 2^8 and share one entry | 723 // waste memory. Thus we limit the array size to 2^8 and share one entry |
714 // with multiple types of vectors. This won't be an issue in practice, | 724 // with multiple types of vectors. This won't be an issue in practice, |
715 // since there will be less than 2^8 types of objects in common cases. | 725 // since there will be less than 2^8 types of objects in common cases. |
716 static const int likelyToBePromptlyFreedArraySize = (1 << 8); | 726 static const int likelyToBePromptlyFreedArraySize = (1 << 8); |
717 static const int likelyToBePromptlyFreedArrayMask = likelyToBePromptlyFreedA rraySize - 1; | 727 static const int likelyToBePromptlyFreedArrayMask = likelyToBePromptlyFreedA rraySize - 1; |
718 OwnPtr<int[]> m_likelyToBePromptlyFreed; | 728 OwnPtr<int[]> m_likelyToBePromptlyFreed; |
(...skipping 12 matching lines...) Expand all Loading... | |
731 }; | 741 }; |
732 | 742 |
733 template<> class ThreadStateFor<AnyThread> { | 743 template<> class ThreadStateFor<AnyThread> { |
734 public: | 744 public: |
735 static ThreadState* state() { return ThreadState::current(); } | 745 static ThreadState* state() { return ThreadState::current(); } |
736 }; | 746 }; |
737 | 747 |
738 } // namespace blink | 748 } // namespace blink |
739 | 749 |
740 #endif // ThreadState_h | 750 #endif // ThreadState_h |
OLD | NEW |