Chromium Code Reviews| 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 21 matching lines...) Expand all Loading... | |
| 32 #include "platform/heap/ThreadState.h" | 32 #include "platform/heap/ThreadState.h" |
| 33 | 33 |
| 34 #include "platform/ScriptForbiddenScope.h" | 34 #include "platform/ScriptForbiddenScope.h" |
| 35 #include "platform/TraceEvent.h" | 35 #include "platform/TraceEvent.h" |
| 36 #include "platform/heap/AddressSanitizer.h" | 36 #include "platform/heap/AddressSanitizer.h" |
| 37 #include "platform/heap/CallbackStack.h" | 37 #include "platform/heap/CallbackStack.h" |
| 38 #include "platform/heap/Handle.h" | 38 #include "platform/heap/Handle.h" |
| 39 #include "platform/heap/Heap.h" | 39 #include "platform/heap/Heap.h" |
| 40 #include "platform/heap/SafePoint.h" | 40 #include "platform/heap/SafePoint.h" |
| 41 #include "public/platform/Platform.h" | 41 #include "public/platform/Platform.h" |
| 42 #include "public/platform/WebMemoryAllocatorDump.h" | |
| 43 #include "public/platform/WebProcessMemoryDump.h" | |
| 42 #include "public/platform/WebScheduler.h" | 44 #include "public/platform/WebScheduler.h" |
| 43 #include "public/platform/WebThread.h" | 45 #include "public/platform/WebThread.h" |
| 44 #include "public/platform/WebTraceLocation.h" | 46 #include "public/platform/WebTraceLocation.h" |
| 45 #include "wtf/Partitions.h" | 47 #include "wtf/Partitions.h" |
| 46 #include "wtf/ThreadingPrimitives.h" | 48 #include "wtf/ThreadingPrimitives.h" |
| 47 #if ENABLE(GC_PROFILING) | 49 #if ENABLE(GC_PROFILING) |
| 48 #include "platform/TracedValue.h" | 50 #include "platform/TracedValue.h" |
| 49 #include "wtf/text/StringHash.h" | 51 #include "wtf/text/StringHash.h" |
| 50 #endif | 52 #endif |
| 51 | 53 |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 120 } | 122 } |
| 121 | 123 |
| 122 for (int heapIndex = 0; heapIndex < LargeObjectHeapIndex; heapIndex++) | 124 for (int heapIndex = 0; heapIndex < LargeObjectHeapIndex; heapIndex++) |
| 123 m_heaps[heapIndex] = new NormalPageHeap(this, heapIndex); | 125 m_heaps[heapIndex] = new NormalPageHeap(this, heapIndex); |
| 124 m_heaps[LargeObjectHeapIndex] = new LargeObjectHeap(this, LargeObjectHeapInd ex); | 126 m_heaps[LargeObjectHeapIndex] = new LargeObjectHeap(this, LargeObjectHeapInd ex); |
| 125 | 127 |
| 126 m_likelyToBePromptlyFreed = adoptArrayPtr(new int[likelyToBePromptlyFreedArr aySize]); | 128 m_likelyToBePromptlyFreed = adoptArrayPtr(new int[likelyToBePromptlyFreedArr aySize]); |
| 127 clearHeapAges(); | 129 clearHeapAges(); |
| 128 | 130 |
| 129 m_weakCallbackStack = new CallbackStack(); | 131 m_weakCallbackStack = new CallbackStack(); |
| 132 | |
| 133 if (Platform::current()->currentThread()) | |
| 134 Platform::current()->registerMemoryDumpProvider(this); | |
| 130 } | 135 } |
| 131 | 136 |
| 132 ThreadState::~ThreadState() | 137 ThreadState::~ThreadState() |
| 133 { | 138 { |
| 134 checkThread(); | 139 checkThread(); |
| 140 | |
| 141 if (Platform::current()->currentThread()) | |
| 142 Platform::current()->unregisterMemoryDumpProvider(this); | |
| 143 | |
| 135 delete m_weakCallbackStack; | 144 delete m_weakCallbackStack; |
| 136 m_weakCallbackStack = nullptr; | 145 m_weakCallbackStack = nullptr; |
| 137 for (int i = 0; i < NumberOfHeaps; ++i) | 146 for (int i = 0; i < NumberOfHeaps; ++i) |
| 138 delete m_heaps[i]; | 147 delete m_heaps[i]; |
| 139 deleteAllValues(m_interruptors); | 148 deleteAllValues(m_interruptors); |
| 140 **s_threadSpecific = nullptr; | 149 **s_threadSpecific = nullptr; |
| 141 if (isMainThread()) { | 150 if (isMainThread()) { |
| 142 s_mainThreadStackStart = 0; | 151 s_mainThreadStackStart = 0; |
| 143 s_mainThreadUnderestimatedStackSize = 0; | 152 s_mainThreadUnderestimatedStackSize = 0; |
| 144 } | 153 } |
| (...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 373 | 382 |
| 374 void ThreadState::visitPersistents(Visitor* visitor) | 383 void ThreadState::visitPersistents(Visitor* visitor) |
| 375 { | 384 { |
| 376 m_persistents->trace(visitor); | 385 m_persistents->trace(visitor); |
| 377 if (m_traceDOMWrappers) { | 386 if (m_traceDOMWrappers) { |
| 378 TRACE_EVENT0("blink_gc", "V8GCController::traceDOMWrappers"); | 387 TRACE_EVENT0("blink_gc", "V8GCController::traceDOMWrappers"); |
| 379 m_traceDOMWrappers(m_isolate, visitor); | 388 m_traceDOMWrappers(m_isolate, visitor); |
| 380 } | 389 } |
| 381 } | 390 } |
| 382 | 391 |
| 392 void ThreadState::dumpMemoryIfNecessary() | |
| 393 { | |
| 394 bool enabled; | |
| 395 TRACE_EVENT_CATEGORY_GROUP_ENABLED(TRACE_DISABLED_BY_DEFAULT("memory-infra") , &enabled); | |
|
Primiano Tucci (use gerrit)
2015/05/21 18:43:10
Ok to this as a temporary hack, but plz add a clea
ssid
2015/05/22 13:34:06
Done. Check heap.cpp
| |
| 396 if (!enabled) | |
| 397 return; | |
| 398 | |
| 399 m_lastProcessMemoryDump = adoptPtr(Platform::current()->createProcessMemoryD ump()); | |
| 400 | |
| 401 #define SNAPSHOT_HEAP(HeapType) \ | |
| 402 { \ | |
| 403 String allocatorBaseName; \ | |
| 404 if (isMainThread()) { \ | |
| 405 allocatorBaseName = String("blink_gc/thread_main/heaps/" #HeapType); \ | |
| 406 } \ | |
| 407 else { \ | |
| 408 allocatorBaseName = String::format("blink_gc/thread_%ld/heaps/" #Hea pType, m_thread); \ | |
| 409 } \ | |
| 410 m_heaps[HeapType##HeapIndex]->dumpMemoryInto(m_lastProcessMemoryDump.get (), &allocatorBaseName); \ | |
| 411 } | |
| 412 | |
| 413 SNAPSHOT_HEAP(NormalPage1); | |
|
Primiano Tucci (use gerrit)
2015/05/21 18:43:10
You either want to remove the ; here (otherwise so
ssid
2015/05/22 13:34:07
This is the style in the same file. function Threa
| |
| 414 SNAPSHOT_HEAP(NormalPage2); | |
| 415 SNAPSHOT_HEAP(NormalPage3); | |
| 416 SNAPSHOT_HEAP(NormalPage4); | |
| 417 SNAPSHOT_HEAP(Vector1); | |
| 418 SNAPSHOT_HEAP(Vector2); | |
| 419 SNAPSHOT_HEAP(Vector3); | |
| 420 SNAPSHOT_HEAP(Vector4); | |
| 421 SNAPSHOT_HEAP(InlineVector); | |
| 422 SNAPSHOT_HEAP(HashTable); | |
| 423 SNAPSHOT_HEAP(LargeObject); | |
| 424 FOR_EACH_TYPED_HEAP(SNAPSHOT_HEAP); | |
| 425 | |
| 426 #undef SNAPSHOT_HEAP | |
| 427 | |
| 428 // TODO(ssid): Request global dump from blink when support is available | |
| 429 // (crbug.com/490087). | |
|
Primiano Tucci (use gerrit)
2015/05/21 18:43:10
Maybe add a line here saying: For the moment the d
ssid
2015/05/22 13:34:06
done at heap.cpp
| |
| 430 } | |
| 431 | |
| 383 #if ENABLE(GC_PROFILING) | 432 #if ENABLE(GC_PROFILING) |
| 384 const GCInfo* ThreadState::findGCInfo(Address address) | 433 const GCInfo* ThreadState::findGCInfo(Address address) |
| 385 { | 434 { |
| 386 if (BasePage* page = findPageFromAddress(address)) | 435 if (BasePage* page = findPageFromAddress(address)) |
| 387 return page->findGCInfo(address); | 436 return page->findGCInfo(address); |
| 388 return nullptr; | 437 return nullptr; |
| 389 } | 438 } |
| 390 | 439 |
| 391 size_t ThreadState::SnapshotInfo::getClassTag(const GCInfo* gcInfo) | 440 size_t ThreadState::SnapshotInfo::getClassTag(const GCInfo* gcInfo) |
| 392 { | 441 { |
| (...skipping 442 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 835 makeConsistentForSweeping(); | 884 makeConsistentForSweeping(); |
| 836 prepareRegionTree(); | 885 prepareRegionTree(); |
| 837 flushHeapDoesNotContainCacheIfNeeded(); | 886 flushHeapDoesNotContainCacheIfNeeded(); |
| 838 clearHeapAges(); | 887 clearHeapAges(); |
| 839 } | 888 } |
| 840 | 889 |
| 841 void ThreadState::postGC(GCType gcType) | 890 void ThreadState::postGC(GCType gcType) |
| 842 { | 891 { |
| 843 ASSERT(isInGC()); | 892 ASSERT(isInGC()); |
| 844 | 893 |
| 894 dumpMemoryIfNecessary(); | |
| 845 #if ENABLE(GC_PROFILING) | 895 #if ENABLE(GC_PROFILING) |
| 846 // We snapshot the heap prior to sweeping to get numbers for both resources | 896 // We snapshot the heap prior to sweeping to get numbers for both resources |
| 847 // that have been allocated since the last GC and for resources that are | 897 // that have been allocated since the last GC and for resources that are |
| 848 // going to be freed. | 898 // going to be freed. |
| 849 bool gcTracingEnabled; | 899 bool gcTracingEnabled; |
| 850 TRACE_EVENT_CATEGORY_GROUP_ENABLED("blink_gc", &gcTracingEnabled); | 900 TRACE_EVENT_CATEGORY_GROUP_ENABLED("blink_gc", &gcTracingEnabled); |
| 851 | 901 |
| 852 if (gcTracingEnabled) { | 902 if (gcTracingEnabled) { |
| 853 bool disabledByDefaultGCTracingEnabled; | 903 bool disabledByDefaultGCTracingEnabled; |
| 854 TRACE_EVENT_CATEGORY_GROUP_ENABLED(TRACE_DISABLED_BY_DEFAULT("blink_gc") , &disabledByDefaultGCTracingEnabled); | 904 TRACE_EVENT_CATEGORY_GROUP_ENABLED(TRACE_DISABLED_BY_DEFAULT("blink_gc") , &disabledByDefaultGCTracingEnabled); |
| (...skipping 361 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1216 m_vectorBackingHeapIndex = heapIndexOfVectorHeapLeastRecentlyExpanded(Ve ctor1HeapIndex, Vector4HeapIndex); | 1266 m_vectorBackingHeapIndex = heapIndexOfVectorHeapLeastRecentlyExpanded(Ve ctor1HeapIndex, Vector4HeapIndex); |
| 1217 } | 1267 } |
| 1218 | 1268 |
| 1219 void ThreadState::promptlyFreed(size_t gcInfoIndex) | 1269 void ThreadState::promptlyFreed(size_t gcInfoIndex) |
| 1220 { | 1270 { |
| 1221 size_t entryIndex = gcInfoIndex & likelyToBePromptlyFreedArrayMask; | 1271 size_t entryIndex = gcInfoIndex & likelyToBePromptlyFreedArrayMask; |
| 1222 // See the comment in vectorBackingHeap() for why this is +3. | 1272 // See the comment in vectorBackingHeap() for why this is +3. |
| 1223 m_likelyToBePromptlyFreed[entryIndex] += 3; | 1273 m_likelyToBePromptlyFreed[entryIndex] += 3; |
| 1224 } | 1274 } |
| 1225 | 1275 |
| 1276 bool ThreadState::onMemoryDump(WebProcessMemoryDump* memoryDump) | |
| 1277 { | |
| 1278 // Returns true because it might be able to provide dump in future. On | |
| 1279 // returning false, the memory dump manager stops collecting dumps from | |
| 1280 // this provider. | |
| 1281 if (!m_lastProcessMemoryDump.get()) | |
| 1282 return true; | |
|
Primiano Tucci (use gerrit)
2015/05/21 18:43:10
Ok for now, but this should really return false.
I
ssid
2015/05/22 13:34:06
Not sure if this is relevant any more.
| |
| 1283 | |
| 1284 memoryDump->takeAllDumpsFrom(m_lastProcessMemoryDump.get()); | |
| 1285 return true; | |
| 1286 } | |
| 1287 | |
| 1226 #if ENABLE(GC_PROFILING) | 1288 #if ENABLE(GC_PROFILING) |
| 1227 const GCInfo* ThreadState::findGCInfoFromAllThreads(Address address) | 1289 const GCInfo* ThreadState::findGCInfoFromAllThreads(Address address) |
| 1228 { | 1290 { |
| 1229 bool needLockForIteration = !ThreadState::current()->isInGC(); | 1291 bool needLockForIteration = !ThreadState::current()->isInGC(); |
| 1230 if (needLockForIteration) | 1292 if (needLockForIteration) |
| 1231 threadAttachMutex().lock(); | 1293 threadAttachMutex().lock(); |
| 1232 | 1294 |
| 1233 for (ThreadState* state : attachedThreads()) { | 1295 for (ThreadState* state : attachedThreads()) { |
| 1234 if (const GCInfo* gcInfo = state->findGCInfo(address)) { | 1296 if (const GCInfo* gcInfo = state->findGCInfo(address)) { |
| 1235 if (needLockForIteration) | 1297 if (needLockForIteration) |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1306 json->beginArray(it->key.ascii().data()); | 1368 json->beginArray(it->key.ascii().data()); |
| 1307 for (size_t age = 0; age <= maxHeapObjectAge; ++age) | 1369 for (size_t age = 0; age <= maxHeapObjectAge; ++age) |
| 1308 json->pushInteger(it->value.ages[age]); | 1370 json->pushInteger(it->value.ages[age]); |
| 1309 json->endArray(); | 1371 json->endArray(); |
| 1310 } | 1372 } |
| 1311 TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID(TRACE_DISABLED_BY_DEFAULT("blink_gc"), s tatsName, this, json.release()); | 1373 TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID(TRACE_DISABLED_BY_DEFAULT("blink_gc"), s tatsName, this, json.release()); |
| 1312 } | 1374 } |
| 1313 #endif | 1375 #endif |
| 1314 | 1376 |
| 1315 } // namespace blink | 1377 } // namespace blink |
| OLD | NEW |