| Index: Source/heap/ThreadState.cpp | 
| diff --git a/Source/heap/ThreadState.cpp b/Source/heap/ThreadState.cpp | 
| index 233a979afe7ea6e39a9d325529717307e42d90a9..58735a1bf4dd93a325bc49d13003e306ae05f926 100644 | 
| --- a/Source/heap/ThreadState.cpp | 
| +++ b/Source/heap/ThreadState.cpp | 
| @@ -296,13 +296,7 @@ void ThreadState::cleanup() | 
| // After this GC we expect heap to be empty because | 
| // preCleanup tasks should have cleared all persistent | 
| // handles that were externally owned. | 
| -    // FIXME: oilpan: we should perform a single GC and everything | 
| -    // should die. Unfortunately it is not the case for all objects | 
| -    // because the hierarchy was not completely moved to the heap and | 
| -    // some heap allocated objects own objects that contain persistents | 
| -    // pointing to other heap allocated objects. | 
| -    Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); | 
| -    Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); | 
| +    Heap::collectAllGarbage(ThreadState::NoHeapPointersOnStack); | 
|  | 
| // Verify that all heaps are empty now. | 
| for (int i = 0; i < NumberOfHeaps; i++) | 
| @@ -317,6 +311,8 @@ void ThreadState::cleanup() | 
| void ThreadState::detach() | 
| { | 
| ThreadState* state = current(); | 
| +    state->cleanup(); | 
| + | 
| // Enter safe point before trying to acquire threadAttachMutex | 
| // to avoid dead lock if another thread is preparing for GC, has acquired | 
| // threadAttachMutex and waiting for other threads to pause or reach a | 
|  |