| 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 835 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 846 } | 846 } |
| 847 | 847 |
| 848 void ThreadState::makeConsistentForGC() | 848 void ThreadState::makeConsistentForGC() |
| 849 { | 849 { |
| 850 ASSERT(isInGC()); | 850 ASSERT(isInGC()); |
| 851 TRACE_EVENT0("blink_gc", "ThreadState::makeConsistentForGC"); | 851 TRACE_EVENT0("blink_gc", "ThreadState::makeConsistentForGC"); |
| 852 for (int i = 0; i < NumberOfHeaps; ++i) | 852 for (int i = 0; i < NumberOfHeaps; ++i) |
| 853 m_heaps[i]->makeConsistentForGC(); | 853 m_heaps[i]->makeConsistentForGC(); |
| 854 } | 854 } |
| 855 | 855 |
| 856 void ThreadState::makeConsistentForMutator() |
| 857 { |
| 858 ASSERT(isInGC()); |
| 859 for (int i = 0; i < NumberOfHeaps; ++i) |
| 860 m_heaps[i]->makeConsistentForMutator(); |
| 861 } |
| 862 |
| 856 void ThreadState::preGC() | 863 void ThreadState::preGC() |
| 857 { | 864 { |
| 858 ASSERT(!isInGC()); | 865 ASSERT(!isInGC()); |
| 859 setGCState(GCRunning); | 866 setGCState(GCRunning); |
| 860 makeConsistentForGC(); | 867 makeConsistentForGC(); |
| 861 prepareRegionTree(); | 868 prepareRegionTree(); |
| 862 flushHeapDoesNotContainCacheIfNeeded(); | 869 flushHeapDoesNotContainCacheIfNeeded(); |
| 863 clearHeapAges(); | 870 clearHeapAges(); |
| 864 } | 871 } |
| 865 | 872 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 878 bool disabledByDefaultGCTracingEnabled; | 885 bool disabledByDefaultGCTracingEnabled; |
| 879 TRACE_EVENT_CATEGORY_GROUP_ENABLED(TRACE_DISABLED_BY_DEFAULT("blink_gc")
, &disabledByDefaultGCTracingEnabled); | 886 TRACE_EVENT_CATEGORY_GROUP_ENABLED(TRACE_DISABLED_BY_DEFAULT("blink_gc")
, &disabledByDefaultGCTracingEnabled); |
| 880 | 887 |
| 881 snapshot(); | 888 snapshot(); |
| 882 if (disabledByDefaultGCTracingEnabled) | 889 if (disabledByDefaultGCTracingEnabled) |
| 883 collectAndReportMarkSweepStats(); | 890 collectAndReportMarkSweepStats(); |
| 884 incrementMarkedObjectsAge(); | 891 incrementMarkedObjectsAge(); |
| 885 } | 892 } |
| 886 #endif | 893 #endif |
| 887 | 894 |
| 888 setGCState(gcType == GCWithSweep ? EagerSweepScheduled : LazySweepScheduled)
; | |
| 889 for (int i = 0; i < NumberOfHeaps; i++) | 895 for (int i = 0; i < NumberOfHeaps; i++) |
| 890 m_heaps[i]->prepareForSweep(); | 896 m_heaps[i]->prepareForSweep(); |
| 897 |
| 898 if (gcType == GCWithSweep) { |
| 899 setGCState(EagerSweepScheduled); |
| 900 } else if (gcType == GCWithoutSweep) { |
| 901 setGCState(LazySweepScheduled); |
| 902 } else { |
| 903 takeSnapshot(); |
| 904 |
| 905 // This unmarks all marked objects and marks all unmarked objects dead. |
| 906 makeConsistentForMutator(); |
| 907 |
| 908 // Force setting NoGCScheduled to circumvent checkThread() |
| 909 // in setGCState(). |
| 910 m_gcState = NoGCScheduled; |
| 911 } |
| 891 } | 912 } |
| 892 | 913 |
| 893 void ThreadState::preSweep() | 914 void ThreadState::preSweep() |
| 894 { | 915 { |
| 895 checkThread(); | 916 checkThread(); |
| 896 if (gcState() != EagerSweepScheduled && gcState() != LazySweepScheduled) | 917 if (gcState() != EagerSweepScheduled && gcState() != LazySweepScheduled) |
| 897 return; | 918 return; |
| 898 | 919 |
| 899 { | 920 { |
| 900 if (isMainThread()) | 921 if (isMainThread()) |
| (...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1290 m_vectorBackingHeapIndex = heapIndexOfVectorHeapLeastRecentlyExpanded(Ve
ctor1HeapIndex, Vector4HeapIndex); | 1311 m_vectorBackingHeapIndex = heapIndexOfVectorHeapLeastRecentlyExpanded(Ve
ctor1HeapIndex, Vector4HeapIndex); |
| 1291 } | 1312 } |
| 1292 | 1313 |
| 1293 void ThreadState::promptlyFreed(size_t gcInfoIndex) | 1314 void ThreadState::promptlyFreed(size_t gcInfoIndex) |
| 1294 { | 1315 { |
| 1295 size_t entryIndex = gcInfoIndex & likelyToBePromptlyFreedArrayMask; | 1316 size_t entryIndex = gcInfoIndex & likelyToBePromptlyFreedArrayMask; |
| 1296 // See the comment in vectorBackingHeap() for why this is +3. | 1317 // See the comment in vectorBackingHeap() for why this is +3. |
| 1297 m_likelyToBePromptlyFreed[entryIndex] += 3; | 1318 m_likelyToBePromptlyFreed[entryIndex] += 3; |
| 1298 } | 1319 } |
| 1299 | 1320 |
| 1321 void ThreadState::takeSnapshot() |
| 1322 { |
| 1323 ASSERT(isInGC()); |
| 1324 // TODO(ssid): Implement this. |
| 1325 } |
| 1326 |
| 1300 #if ENABLE(GC_PROFILING) | 1327 #if ENABLE(GC_PROFILING) |
| 1301 const GCInfo* ThreadState::findGCInfoFromAllThreads(Address address) | 1328 const GCInfo* ThreadState::findGCInfoFromAllThreads(Address address) |
| 1302 { | 1329 { |
| 1303 bool needLockForIteration = !ThreadState::current()->isInGC(); | 1330 bool needLockForIteration = !ThreadState::current()->isInGC(); |
| 1304 if (needLockForIteration) | 1331 if (needLockForIteration) |
| 1305 threadAttachMutex().lock(); | 1332 threadAttachMutex().lock(); |
| 1306 | 1333 |
| 1307 for (ThreadState* state : attachedThreads()) { | 1334 for (ThreadState* state : attachedThreads()) { |
| 1308 if (const GCInfo* gcInfo = state->findGCInfo(address)) { | 1335 if (const GCInfo* gcInfo = state->findGCInfo(address)) { |
| 1309 if (needLockForIteration) | 1336 if (needLockForIteration) |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1380 json->beginArray(it->key.ascii().data()); | 1407 json->beginArray(it->key.ascii().data()); |
| 1381 for (size_t age = 0; age <= maxHeapObjectAge; ++age) | 1408 for (size_t age = 0; age <= maxHeapObjectAge; ++age) |
| 1382 json->pushInteger(it->value.ages[age]); | 1409 json->pushInteger(it->value.ages[age]); |
| 1383 json->endArray(); | 1410 json->endArray(); |
| 1384 } | 1411 } |
| 1385 TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID(TRACE_DISABLED_BY_DEFAULT("blink_gc"), s
tatsName, this, json.release()); | 1412 TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID(TRACE_DISABLED_BY_DEFAULT("blink_gc"), s
tatsName, this, json.release()); |
| 1386 } | 1413 } |
| 1387 #endif | 1414 #endif |
| 1388 | 1415 |
| 1389 } // namespace blink | 1416 } // namespace blink |
| OLD | NEW |