Index: Source/platform/heap/ThreadState.cpp |
diff --git a/Source/platform/heap/ThreadState.cpp b/Source/platform/heap/ThreadState.cpp |
index 90421079cecaaf7ecf0b5030bc839390d1bd024c..019fa3776fc88b06f2c06c9f5bdc9bbae1457b83 100644 |
--- a/Source/platform/heap/ThreadState.cpp |
+++ b/Source/platform/heap/ThreadState.cpp |
@@ -849,6 +849,13 @@ void ThreadState::makeConsistentForGC() |
m_heaps[i]->makeConsistentForGC(); |
} |
+void ThreadState::makeConsistentForMutator() |
+{ |
+ ASSERT(isInGC()); |
+ for (int i = 0; i < NumberOfHeaps; ++i) |
+ m_heaps[i]->makeConsistentForMutator(); |
+} |
+ |
void ThreadState::preGC() |
{ |
ASSERT(!isInGC()); |
@@ -881,9 +888,23 @@ void ThreadState::postGC(GCType gcType) |
} |
#endif |
- setGCState(gcType == GCWithSweep ? EagerSweepScheduled : LazySweepScheduled); |
for (int i = 0; i < NumberOfHeaps; i++) |
m_heaps[i]->prepareForSweep(); |
+ |
+ if (gcType == GCWithSweep) { |
+ setGCState(EagerSweepScheduled); |
+ } else if (gcType == GCWithoutSweep) { |
+ setGCState(LazySweepScheduled); |
+ } else { |
+ takeSnapshot(); |
+ |
+ // This unmarks all marked objects and marks all unmarked objects dead. |
+ makeConsistentForMutator(); |
+ |
+ // Force setting NoGCScheduled to circumvent checkThread() |
+ // in setGCState(). |
+ m_gcState = NoGCScheduled; |
+ } |
} |
void ThreadState::preSweep() |
@@ -1266,6 +1287,12 @@ void ThreadState::promptlyFreed(size_t gcInfoIndex) |
m_likelyToBePromptlyFreed[entryIndex] += 3; |
} |
+void ThreadState::takeSnapshot() |
+{ |
+ ASSERT(isInGC()); |
+ // TODO(ssid): Implement this. |
+} |
+ |
#if ENABLE(GC_PROFILING) |
const GCInfo* ThreadState::findGCInfoFromAllThreads(Address address) |
{ |