ECode RequestHandlerThread::WaitUntilIdle() { AutoPtr<IHandler> handler; WaitAndGetHandler((IHandler**)&handler); AutoPtr<ILooper> looper; handler->GetLooper((ILooper**)&looper); Boolean result; looper->IsIdling(&result); if (result) { return NOERROR; } mIdle->Close(); AutoPtr<IMessageQueue> queue; looper->GetQueue((IMessageQueue**)&queue); queue->AddIdleHandler(mIdleHandler); // Ensure that the idle handler gets run even if the looper already went idle handler->SendEmptyMessage(MSG_POKE_IDLE_HANDLER, &result); looper->IsIdling(&result); if (result) { return NOERROR; } mIdle->Block(); return NOERROR; }