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 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
138 // and we need to resume the other threads. | 138 // and we need to resume the other threads. |
139 if (m_shouldResumeThreads) | 139 if (m_shouldResumeThreads) |
140 m_state->heap().resume(); | 140 m_state->heap().resume(); |
141 } | 141 } |
142 | 142 |
143 private: | 143 private: |
144 ThreadState* m_state; | 144 ThreadState* m_state; |
145 bool m_shouldResumeThreads; | 145 bool m_shouldResumeThreads; |
146 }; | 146 }; |
147 | 147 |
148 ThreadState::ThreadState(bool perThreadHeapEnabled) | 148 ThreadState::ThreadState(BlinkGC::ThreadHeapMode threadHeapMode) |
149 : m_thread(currentThread()) | 149 : m_thread(currentThread()) |
150 , m_persistentRegion(wrapUnique(new PersistentRegion())) | 150 , m_persistentRegion(wrapUnique(new PersistentRegion())) |
151 #if OS(WIN) && COMPILER(MSVC) | 151 #if OS(WIN) && COMPILER(MSVC) |
152 , m_threadStackSize(0) | 152 , m_threadStackSize(0) |
153 #endif | 153 #endif |
154 , m_startOfStack(reinterpret_cast<intptr_t*>(StackFrameDepth::getStackStart(
))) | 154 , m_startOfStack(reinterpret_cast<intptr_t*>(StackFrameDepth::getStackStart(
))) |
155 , m_endOfStack(reinterpret_cast<intptr_t*>(StackFrameDepth::getStackStart())
) | 155 , m_endOfStack(reinterpret_cast<intptr_t*>(StackFrameDepth::getStackStart())
) |
156 , m_safePointScopeMarker(nullptr) | 156 , m_safePointScopeMarker(nullptr) |
157 , m_atSafePoint(false) | 157 , m_atSafePoint(false) |
158 , m_interruptors() | 158 , m_interruptors() |
159 , m_sweepForbidden(false) | 159 , m_sweepForbidden(false) |
160 , m_noAllocationCount(0) | 160 , m_noAllocationCount(0) |
161 , m_gcForbiddenCount(0) | 161 , m_gcForbiddenCount(0) |
162 , m_accumulatedSweepingTime(0) | 162 , m_accumulatedSweepingTime(0) |
163 , m_vectorBackingArenaIndex(BlinkGC::Vector1ArenaIndex) | 163 , m_vectorBackingArenaIndex(BlinkGC::Vector1ArenaIndex) |
164 , m_currentArenaAges(0) | 164 , m_currentArenaAges(0) |
165 , m_perThreadHeapEnabled(perThreadHeapEnabled) | 165 , m_threadHeapMode(threadHeapMode) |
166 , m_isTerminating(false) | 166 , m_isTerminating(false) |
167 , m_gcMixinMarker(nullptr) | 167 , m_gcMixinMarker(nullptr) |
168 , m_shouldFlushHeapDoesNotContainCache(false) | 168 , m_shouldFlushHeapDoesNotContainCache(false) |
169 , m_gcState(NoGCScheduled) | 169 , m_gcState(NoGCScheduled) |
170 , m_threadLocalWeakCallbackStack(CallbackStack::create()) | 170 , m_threadLocalWeakCallbackStack(CallbackStack::create()) |
171 , m_isolate(nullptr) | 171 , m_isolate(nullptr) |
172 , m_traceDOMWrappers(nullptr) | 172 , m_traceDOMWrappers(nullptr) |
173 , m_invalidateDeadObjectsInWrappersMarkingDeque(nullptr) | 173 , m_invalidateDeadObjectsInWrappersMarkingDeque(nullptr) |
174 #if defined(ADDRESS_SANITIZER) | 174 #if defined(ADDRESS_SANITIZER) |
175 , m_asanFakeStack(__asan_get_current_fake_stack()) | 175 , m_asanFakeStack(__asan_get_current_fake_stack()) |
176 #endif | 176 #endif |
177 #if defined(LEAK_SANITIZER) | 177 #if defined(LEAK_SANITIZER) |
178 , m_disabledStaticPersistentsRegistration(0) | 178 , m_disabledStaticPersistentsRegistration(0) |
179 #endif | 179 #endif |
180 , m_allocatedObjectSize(0) | 180 , m_allocatedObjectSize(0) |
181 , m_markedObjectSize(0) | 181 , m_markedObjectSize(0) |
182 , m_reportedMemoryToV8(0) | 182 , m_reportedMemoryToV8(0) |
183 { | 183 { |
184 ASSERT(checkThread()); | 184 ASSERT(checkThread()); |
185 ASSERT(!**s_threadSpecific); | 185 ASSERT(!**s_threadSpecific); |
186 **s_threadSpecific = this; | 186 **s_threadSpecific = this; |
187 | 187 |
188 if (m_perThreadHeapEnabled) { | 188 switch (m_threadHeapMode) { |
| 189 case BlinkGC::MainThreadHeapMode: |
| 190 if (isMainThread()) { |
| 191 s_mainThreadStackStart = reinterpret_cast<uintptr_t>(m_startOfStack)
- sizeof(void*); |
| 192 size_t underestimatedStackSize = StackFrameDepth::getUnderestimatedS
tackSize(); |
| 193 if (underestimatedStackSize > sizeof(void*)) |
| 194 s_mainThreadUnderestimatedStackSize = underestimatedStackSize -
sizeof(void*); |
| 195 m_heap = new ThreadHeap(); |
| 196 } else { |
| 197 m_heap = &ThreadState::mainThreadState()->heap(); |
| 198 } |
| 199 break; |
| 200 case BlinkGC::PerThreadHeapMode: |
189 m_heap = new ThreadHeap(); | 201 m_heap = new ThreadHeap(); |
190 } else if (isMainThread()) { | 202 break; |
191 s_mainThreadStackStart = reinterpret_cast<uintptr_t>(m_startOfStack) - s
izeof(void*); | |
192 size_t underestimatedStackSize = StackFrameDepth::getUnderestimatedStack
Size(); | |
193 if (underestimatedStackSize > sizeof(void*)) | |
194 s_mainThreadUnderestimatedStackSize = underestimatedStackSize - size
of(void*); | |
195 m_heap = new ThreadHeap(); | |
196 } else { | |
197 m_heap = &ThreadState::mainThreadState()->heap(); | |
198 } | 203 } |
199 ASSERT(m_heap); | 204 ASSERT(m_heap); |
200 m_heap->attach(this); | 205 m_heap->attach(this); |
201 | 206 |
202 for (int arenaIndex = 0; arenaIndex < BlinkGC::LargeObjectArenaIndex; arenaI
ndex++) | 207 for (int arenaIndex = 0; arenaIndex < BlinkGC::LargeObjectArenaIndex; arenaI
ndex++) |
203 m_arenas[arenaIndex] = new NormalPageArena(this, arenaIndex); | 208 m_arenas[arenaIndex] = new NormalPageArena(this, arenaIndex); |
204 m_arenas[BlinkGC::LargeObjectArenaIndex] = new LargeObjectArena(this, BlinkG
C::LargeObjectArenaIndex); | 209 m_arenas[BlinkGC::LargeObjectArenaIndex] = new LargeObjectArena(this, BlinkG
C::LargeObjectArenaIndex); |
205 | 210 |
206 m_likelyToBePromptlyFreed = wrapArrayUnique(new int[likelyToBePromptlyFreedA
rraySize]); | 211 m_likelyToBePromptlyFreed = wrapArrayUnique(new int[likelyToBePromptlyFreedA
rraySize]); |
207 clearArenaAges(); | 212 clearArenaAges(); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
252 RELEASE_ASSERT(m_threadStackSize > 4 * 0x1000); | 257 RELEASE_ASSERT(m_threadStackSize > 4 * 0x1000); |
253 m_threadStackSize -= 4 * 0x1000; | 258 m_threadStackSize -= 4 * 0x1000; |
254 return m_threadStackSize; | 259 return m_threadStackSize; |
255 } | 260 } |
256 #endif | 261 #endif |
257 | 262 |
258 void ThreadState::attachMainThread() | 263 void ThreadState::attachMainThread() |
259 { | 264 { |
260 RELEASE_ASSERT(!ProcessHeap::s_shutdownComplete); | 265 RELEASE_ASSERT(!ProcessHeap::s_shutdownComplete); |
261 s_threadSpecific = new WTF::ThreadSpecific<ThreadState*>(); | 266 s_threadSpecific = new WTF::ThreadSpecific<ThreadState*>(); |
262 new (s_mainThreadStateStorage) ThreadState(false); | 267 new (s_mainThreadStateStorage) ThreadState(BlinkGC::MainThreadHeapMode); |
263 } | 268 } |
264 | 269 |
265 void ThreadState::attachCurrentThread(bool perThreadHeapEnabled) | 270 void ThreadState::attachCurrentThread(BlinkGC::ThreadHeapMode threadHeapMode) |
266 { | 271 { |
267 RELEASE_ASSERT(!ProcessHeap::s_shutdownComplete); | 272 RELEASE_ASSERT(!ProcessHeap::s_shutdownComplete); |
268 new ThreadState(perThreadHeapEnabled); | 273 new ThreadState(threadHeapMode); |
269 } | 274 } |
270 | 275 |
271 void ThreadState::cleanupPages() | 276 void ThreadState::cleanupPages() |
272 { | 277 { |
273 ASSERT(checkThread()); | 278 ASSERT(checkThread()); |
274 for (int i = 0; i < BlinkGC::NumberOfArenas; ++i) | 279 for (int i = 0; i < BlinkGC::NumberOfArenas; ++i) |
275 m_arenas[i]->cleanupPages(); | 280 m_arenas[i]->cleanupPages(); |
276 } | 281 } |
277 | 282 |
278 void ThreadState::runTerminationGC() | 283 void ThreadState::runTerminationGC() |
(...skipping 1468 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1747 for (int i = 0; i < 5; ++i) { | 1752 for (int i = 0; i < 5; ++i) { |
1748 collectGarbage(BlinkGC::NoHeapPointersOnStack, BlinkGC::GCWithSweep, Bli
nkGC::ForcedGC); | 1753 collectGarbage(BlinkGC::NoHeapPointersOnStack, BlinkGC::GCWithSweep, Bli
nkGC::ForcedGC); |
1749 size_t liveObjects = heap().heapStats().markedObjectSize(); | 1754 size_t liveObjects = heap().heapStats().markedObjectSize(); |
1750 if (liveObjects == previousLiveObjects) | 1755 if (liveObjects == previousLiveObjects) |
1751 break; | 1756 break; |
1752 previousLiveObjects = liveObjects; | 1757 previousLiveObjects = liveObjects; |
1753 } | 1758 } |
1754 } | 1759 } |
1755 | 1760 |
1756 } // namespace blink | 1761 } // namespace blink |
OLD | NEW |