Attempt to make waitForIdleHandler reliable.
The current implementation of IdleableHandlerThread is based on the assumption that MessageQueue#isIdle will return true iff the message loop has finished processing its messages. Unfortunately, this is incorrect: isIdle returns true iff are no more messages waiting in the queue; thus, it will also return true while it is processing the last message before going idle. Instead of using idle handlers, take the simpler approach of posting a runnable to the message loop and waiting for it to be processed. Test: see other CLs in this patch series Bug: 31479480 Change-Id: Iae75781f067b762c8653a488a5e4d5ee0c789e01
This commit is contained in:
@@ -155,25 +155,13 @@ public class ConnectivityServiceTest extends AndroidTestCase {
|
|||||||
/**
|
/**
|
||||||
* Block until the given handler becomes idle, or until timeoutMs has passed.
|
* Block until the given handler becomes idle, or until timeoutMs has passed.
|
||||||
*/
|
*/
|
||||||
private static void waitForIdleHandler(HandlerThread handler, int timeoutMs) {
|
private static void waitForIdleHandler(HandlerThread handlerThread, int timeoutMs) {
|
||||||
final ConditionVariable cv = new ConditionVariable();
|
final ConditionVariable cv = new ConditionVariable();
|
||||||
final MessageQueue queue = handler.getLooper().getQueue();
|
final Handler handler = new Handler(handlerThread.getLooper());
|
||||||
final IdleHandler idleHandler = () -> {
|
handler.post(() -> cv.open());
|
||||||
synchronized (queue) {
|
|
||||||
cv.open();
|
|
||||||
return false; // Remove the idleHandler.
|
|
||||||
}
|
|
||||||
};
|
|
||||||
synchronized (queue) {
|
|
||||||
if (queue.isIdle()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
queue.addIdleHandler(idleHandler);
|
|
||||||
}
|
|
||||||
if (!cv.block(timeoutMs)) {
|
if (!cv.block(timeoutMs)) {
|
||||||
fail("HandlerThread " + handler.getName() +
|
fail("HandlerThread " + handlerThread.getName() +
|
||||||
" did not become idle after " + timeoutMs + " ms");
|
" did not become idle after " + timeoutMs + " ms");
|
||||||
queue.removeIdleHandler(idleHandler);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user