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 { |
139 if (Platform::current()->currentThread()) | |
140 Platform::current()->unregisterMemoryDumpProvider(this); | |
141 | |
134 checkThread(); | 142 checkThread(); |
Primiano Tucci (use gerrit)
2015/05/21 09:56:34
keep checkThread on the top, if this ends up in th
ssid
2015/05/21 11:38:55
Done.
| |
135 delete m_weakCallbackStack; | 143 delete m_weakCallbackStack; |
136 m_weakCallbackStack = nullptr; | 144 m_weakCallbackStack = nullptr; |
137 for (int i = 0; i < NumberOfHeaps; ++i) | 145 for (int i = 0; i < NumberOfHeaps; ++i) |
138 delete m_heaps[i]; | 146 delete m_heaps[i]; |
139 deleteAllValues(m_interruptors); | 147 deleteAllValues(m_interruptors); |
140 **s_threadSpecific = nullptr; | 148 **s_threadSpecific = nullptr; |
141 if (isMainThread()) { | 149 if (isMainThread()) { |
142 s_mainThreadStackStart = 0; | 150 s_mainThreadStackStart = 0; |
143 s_mainThreadUnderestimatedStackSize = 0; | 151 s_mainThreadUnderestimatedStackSize = 0; |
144 } | 152 } |
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
373 | 381 |
374 void ThreadState::visitPersistents(Visitor* visitor) | 382 void ThreadState::visitPersistents(Visitor* visitor) |
375 { | 383 { |
376 m_persistents->trace(visitor); | 384 m_persistents->trace(visitor); |
377 if (m_traceDOMWrappers) { | 385 if (m_traceDOMWrappers) { |
378 TRACE_EVENT0("blink_gc", "V8GCController::traceDOMWrappers"); | 386 TRACE_EVENT0("blink_gc", "V8GCController::traceDOMWrappers"); |
379 m_traceDOMWrappers(m_isolate, visitor); | 387 m_traceDOMWrappers(m_isolate, visitor); |
380 } | 388 } |
381 } | 389 } |
382 | 390 |
391 void ThreadState::snapshotMemoryIfNecessary() | |
Primiano Tucci (use gerrit)
2015/05/21 09:56:34
This is a good name.
I wonder though if we really
ssid
2015/05/21 11:38:55
Not sure, your call.
| |
392 { | |
393 bool enabled; | |
394 TRACE_EVENT_CATEGORY_GROUP_ENABLED(TRACE_DISABLED_BY_DEFAULT("memory-infra") , &enabled); | |
Primiano Tucci (use gerrit)
2015/05/21 09:56:33
I see why you did it (it's the only way to tell to
ssid
2015/05/21 11:38:55
Not sure if i should add a TODO here?
| |
395 if (!enabled) | |
396 return; | |
397 | |
398 snapshotMemory(); | |
399 } | |
400 | |
401 void ThreadState::snapshotMemory() | |
402 { | |
403 // TODO(ssid): uncomment the following line once the support is available, | |
404 // and remove the check for dump being null. | |
405 // m_lastProcessMemoryDump.reset(Platform::current()->getExtraProcessMemoryD ump()); | |
Primiano Tucci (use gerrit)
2015/05/21 09:56:34
I think we need to do some kind of dual buffering
ssid
2015/05/21 11:38:55
Yes this check is for the case that it isn't avail
| |
406 if (!m_lastProcessMemoryDump.get()) | |
407 return; | |
408 | |
409 #define SNAPSHOT_HEAP(HeapType) m_heaps[HeapType##HeapIndex]->snapshotMemory(m_l astProcessMemoryDump.get(), #HeapType); | |
410 | |
411 SNAPSHOT_HEAP(NormalPage1); | |
412 SNAPSHOT_HEAP(NormalPage2); | |
413 SNAPSHOT_HEAP(NormalPage3); | |
414 SNAPSHOT_HEAP(NormalPage4); | |
415 SNAPSHOT_HEAP(Vector1); | |
416 SNAPSHOT_HEAP(Vector2); | |
417 SNAPSHOT_HEAP(Vector3); | |
418 SNAPSHOT_HEAP(Vector4); | |
419 SNAPSHOT_HEAP(InlineVector); | |
420 SNAPSHOT_HEAP(HashTable); | |
421 SNAPSHOT_HEAP(LargeObject); | |
422 FOR_EACH_TYPED_HEAP(SNAPSHOT_HEAP); | |
423 | |
424 #undef SNAPSHOT_FREE_LIST | |
Primiano Tucci (use gerrit)
2015/05/21 09:56:33
I think you meant to undef SNAPSHOT_HEAP here :)
ssid
2015/05/21 11:38:55
Done.
| |
425 | |
426 // TODO(ssid): Request global dump from blink when support is available. | |
427 } | |
428 | |
383 #if ENABLE(GC_PROFILING) | 429 #if ENABLE(GC_PROFILING) |
384 const GCInfo* ThreadState::findGCInfo(Address address) | 430 const GCInfo* ThreadState::findGCInfo(Address address) |
385 { | 431 { |
386 if (BasePage* page = findPageFromAddress(address)) | 432 if (BasePage* page = findPageFromAddress(address)) |
387 return page->findGCInfo(address); | 433 return page->findGCInfo(address); |
388 return nullptr; | 434 return nullptr; |
389 } | 435 } |
390 | 436 |
391 size_t ThreadState::SnapshotInfo::getClassTag(const GCInfo* gcInfo) | 437 size_t ThreadState::SnapshotInfo::getClassTag(const GCInfo* gcInfo) |
392 { | 438 { |
(...skipping 442 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
835 makeConsistentForSweeping(); | 881 makeConsistentForSweeping(); |
836 prepareRegionTree(); | 882 prepareRegionTree(); |
837 flushHeapDoesNotContainCacheIfNeeded(); | 883 flushHeapDoesNotContainCacheIfNeeded(); |
838 clearHeapAges(); | 884 clearHeapAges(); |
839 } | 885 } |
840 | 886 |
841 void ThreadState::postGC(GCType gcType) | 887 void ThreadState::postGC(GCType gcType) |
842 { | 888 { |
843 ASSERT(isInGC()); | 889 ASSERT(isInGC()); |
844 | 890 |
891 snapshotMemoryIfNecessary(); | |
845 #if ENABLE(GC_PROFILING) | 892 #if ENABLE(GC_PROFILING) |
846 // We snapshot the heap prior to sweeping to get numbers for both resources | 893 // 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 | 894 // that have been allocated since the last GC and for resources that are |
848 // going to be freed. | 895 // going to be freed. |
849 bool gcTracingEnabled; | 896 bool gcTracingEnabled; |
850 TRACE_EVENT_CATEGORY_GROUP_ENABLED("blink_gc", &gcTracingEnabled); | 897 TRACE_EVENT_CATEGORY_GROUP_ENABLED("blink_gc", &gcTracingEnabled); |
851 | 898 |
852 if (gcTracingEnabled) { | 899 if (gcTracingEnabled) { |
853 bool disabledByDefaultGCTracingEnabled; | 900 bool disabledByDefaultGCTracingEnabled; |
854 TRACE_EVENT_CATEGORY_GROUP_ENABLED(TRACE_DISABLED_BY_DEFAULT("blink_gc") , &disabledByDefaultGCTracingEnabled); | 901 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); | 1263 m_vectorBackingHeapIndex = heapIndexOfVectorHeapLeastRecentlyExpanded(Ve ctor1HeapIndex, Vector4HeapIndex); |
1217 } | 1264 } |
1218 | 1265 |
1219 void ThreadState::promptlyFreed(size_t gcInfoIndex) | 1266 void ThreadState::promptlyFreed(size_t gcInfoIndex) |
1220 { | 1267 { |
1221 size_t entryIndex = gcInfoIndex & likelyToBePromptlyFreedArrayMask; | 1268 size_t entryIndex = gcInfoIndex & likelyToBePromptlyFreedArrayMask; |
1222 // See the comment in vectorBackingHeap() for why this is +3. | 1269 // See the comment in vectorBackingHeap() for why this is +3. |
1223 m_likelyToBePromptlyFreed[entryIndex] += 3; | 1270 m_likelyToBePromptlyFreed[entryIndex] += 3; |
1224 } | 1271 } |
1225 | 1272 |
1273 bool ThreadState::onMemoryDump(WebProcessMemoryDump* memoryDump) | |
1274 { | |
1275 // Returns true because it might be able to provide dump in future. On | |
1276 // returning false, the memory dump manager stops collecting dumps from | |
1277 // this provider. | |
1278 if (!m_lastProcessMemoryDump.get()) | |
1279 return true; | |
1280 | |
1281 // TODO(ssid): Swap the memory dumps once the support is available. | |
1282 // memoryDump->swap(m_lastProcessMemoryDump.get()); | |
Primiano Tucci (use gerrit)
2015/05/21 09:56:33
The code is not fully there yet, but the final nam
ssid
2015/05/21 11:38:55
Done.
| |
1283 return true; | |
1284 } | |
1285 | |
1226 #if ENABLE(GC_PROFILING) | 1286 #if ENABLE(GC_PROFILING) |
1227 const GCInfo* ThreadState::findGCInfoFromAllThreads(Address address) | 1287 const GCInfo* ThreadState::findGCInfoFromAllThreads(Address address) |
1228 { | 1288 { |
1229 bool needLockForIteration = !ThreadState::current()->isInGC(); | 1289 bool needLockForIteration = !ThreadState::current()->isInGC(); |
1230 if (needLockForIteration) | 1290 if (needLockForIteration) |
1231 threadAttachMutex().lock(); | 1291 threadAttachMutex().lock(); |
1232 | 1292 |
1233 for (ThreadState* state : attachedThreads()) { | 1293 for (ThreadState* state : attachedThreads()) { |
1234 if (const GCInfo* gcInfo = state->findGCInfo(address)) { | 1294 if (const GCInfo* gcInfo = state->findGCInfo(address)) { |
1235 if (needLockForIteration) | 1295 if (needLockForIteration) |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1306 json->beginArray(it->key.ascii().data()); | 1366 json->beginArray(it->key.ascii().data()); |
1307 for (size_t age = 0; age <= maxHeapObjectAge; ++age) | 1367 for (size_t age = 0; age <= maxHeapObjectAge; ++age) |
1308 json->pushInteger(it->value.ages[age]); | 1368 json->pushInteger(it->value.ages[age]); |
1309 json->endArray(); | 1369 json->endArray(); |
1310 } | 1370 } |
1311 TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID(TRACE_DISABLED_BY_DEFAULT("blink_gc"), s tatsName, this, json.release()); | 1371 TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID(TRACE_DISABLED_BY_DEFAULT("blink_gc"), s tatsName, this, json.release()); |
1312 } | 1372 } |
1313 #endif | 1373 #endif |
1314 | 1374 |
1315 } // namespace blink | 1375 } // namespace blink |
OLD | NEW |