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 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
160 m_state->m_sweepForbidden = false; | 160 m_state->m_sweepForbidden = false; |
161 } | 161 } |
162 | 162 |
163 private: | 163 private: |
164 ThreadState* m_state; | 164 ThreadState* m_state; |
165 }; | 165 }; |
166 | 166 |
167 void lockThreadAttachMutex(); | 167 void lockThreadAttachMutex(); |
168 void unlockThreadAttachMutex(); | 168 void unlockThreadAttachMutex(); |
169 | 169 |
170 BlinkGC::ThreadHeapMode threadHeapMode() const { return m_threadHeapMode; } | |
171 | |
172 bool isTerminating() { return m_isTerminating; } | 170 bool isTerminating() { return m_isTerminating; } |
173 | 171 |
174 static void attachMainThread(); | 172 static void attachMainThread(); |
175 static void detachMainThread(); | 173 static void detachMainThread(); |
176 void cleanupMainThread(); | 174 void cleanupMainThread(); |
177 | 175 |
178 // Associate ThreadState object with the current thread. After this | 176 // Associate ThreadState object with the current thread. After this |
179 // call thread can start using the garbage collected heap infrastructure. | 177 // call thread can start using the garbage collected heap infrastructure. |
180 // It also has to periodically check for safepoints. | 178 // It also has to periodically check for safepoints. |
181 static void attachCurrentThread(BlinkGC::ThreadHeapMode); | 179 static void attachCurrentThread(); |
182 | 180 |
183 // Disassociate attached ThreadState from the current thread. The thread | 181 // Disassociate attached ThreadState from the current thread. The thread |
184 // can no longer use the garbage collected heap after this call. | 182 // can no longer use the garbage collected heap after this call. |
185 static void detachCurrentThread(); | 183 static void detachCurrentThread(); |
186 | 184 |
187 static ThreadState* current() { | 185 static ThreadState* current() { |
188 #if defined(__GLIBC__) || OS(ANDROID) || OS(FREEBSD) | 186 #if defined(__GLIBC__) || OS(ANDROID) || OS(FREEBSD) |
189 // TLS lookup is fast in these platforms. | 187 // TLS lookup is fast in these platforms. |
190 return **s_threadSpecific; | 188 return **s_threadSpecific; |
191 #else | 189 #else |
(...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
581 // value. | 579 // value. |
582 bool isOnThreadHeap(const void* object) const { | 580 bool isOnThreadHeap(const void* object) const { |
583 return &fromObject(object)->heap() == &heap(); | 581 return &fromObject(object)->heap() == &heap(); |
584 } | 582 } |
585 | 583 |
586 private: | 584 private: |
587 template <typename T> | 585 template <typename T> |
588 friend class PrefinalizerRegistration; | 586 friend class PrefinalizerRegistration; |
589 enum SnapshotType { HeapSnapshot, FreelistSnapshot }; | 587 enum SnapshotType { HeapSnapshot, FreelistSnapshot }; |
590 | 588 |
591 explicit ThreadState(BlinkGC::ThreadHeapMode); | 589 ThreadState(); |
592 ~ThreadState(); | 590 ~ThreadState(); |
593 | 591 |
594 NO_SANITIZE_ADDRESS void copyStackUntilSafePointScope(); | 592 NO_SANITIZE_ADDRESS void copyStackUntilSafePointScope(); |
595 void clearSafePointScopeMarker() { | 593 void clearSafePointScopeMarker() { |
596 m_safePointStackCopy.clear(); | 594 m_safePointStackCopy.clear(); |
597 m_safePointScopeMarker = nullptr; | 595 m_safePointScopeMarker = nullptr; |
598 } | 596 } |
599 | 597 |
600 // shouldSchedule{Precise,Idle}GC and shouldForceConservativeGC | 598 // shouldSchedule{Precise,Idle}GC and shouldForceConservativeGC |
601 // implement the heuristics that are used to determine when to collect | 599 // implement the heuristics that are used to determine when to collect |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
697 size_t m_noAllocationCount; | 695 size_t m_noAllocationCount; |
698 size_t m_gcForbiddenCount; | 696 size_t m_gcForbiddenCount; |
699 size_t m_mixinsBeingConstructedCount; | 697 size_t m_mixinsBeingConstructedCount; |
700 double m_accumulatedSweepingTime; | 698 double m_accumulatedSweepingTime; |
701 | 699 |
702 BaseArena* m_arenas[BlinkGC::NumberOfArenas]; | 700 BaseArena* m_arenas[BlinkGC::NumberOfArenas]; |
703 int m_vectorBackingArenaIndex; | 701 int m_vectorBackingArenaIndex; |
704 size_t m_arenaAges[BlinkGC::NumberOfArenas]; | 702 size_t m_arenaAges[BlinkGC::NumberOfArenas]; |
705 size_t m_currentArenaAges; | 703 size_t m_currentArenaAges; |
706 | 704 |
707 const BlinkGC::ThreadHeapMode m_threadHeapMode; | |
708 bool m_isTerminating; | 705 bool m_isTerminating; |
709 GarbageCollectedMixinConstructorMarker* m_gcMixinMarker; | 706 GarbageCollectedMixinConstructorMarker* m_gcMixinMarker; |
710 | 707 |
711 bool m_shouldFlushHeapDoesNotContainCache; | 708 bool m_shouldFlushHeapDoesNotContainCache; |
712 GCState m_gcState; | 709 GCState m_gcState; |
713 | 710 |
714 std::unique_ptr<CallbackStack> m_threadLocalWeakCallbackStack; | 711 std::unique_ptr<CallbackStack> m_threadLocalWeakCallbackStack; |
715 | 712 |
716 using PreFinalizerCallback = bool (*)(void*); | 713 using PreFinalizerCallback = bool (*)(void*); |
717 using PreFinalizer = std::pair<void*, PreFinalizerCallback>; | 714 using PreFinalizer = std::pair<void*, PreFinalizerCallback>; |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
775 class ThreadStateFor<AnyThread> { | 772 class ThreadStateFor<AnyThread> { |
776 STATIC_ONLY(ThreadStateFor); | 773 STATIC_ONLY(ThreadStateFor); |
777 | 774 |
778 public: | 775 public: |
779 static ThreadState* state() { return ThreadState::current(); } | 776 static ThreadState* state() { return ThreadState::current(); } |
780 }; | 777 }; |
781 | 778 |
782 } // namespace blink | 779 } // namespace blink |
783 | 780 |
784 #endif // ThreadState_h | 781 #endif // ThreadState_h |
OLD | NEW |