Improve watchdog monitor for InputReader and InputDispatcher.
Try harder to test for liveness. There are situations where
the lock might not be held but the input system is stuck in
a callback into the window manager policy that has hung.
Bug: 5094994
Change-Id: Iff88655512a5dc8bbb4615be65f4115e975c020b
diff --git a/services/input/InputReader.cpp b/services/input/InputReader.cpp
index fa0b3d8..4be06e4 100644
--- a/services/input/InputReader.cpp
+++ b/services/input/InputReader.cpp
@@ -278,17 +278,20 @@
{ // acquire lock
AutoMutex _l(mLock);
+ mReaderIsAliveCondition.broadcast();
if (count) {
processEventsLocked(mEventBuffer, count);
}
if (!count || timeoutMillis == 0) {
nsecs_t now = systemTime(SYSTEM_TIME_MONOTONIC);
+ if (now >= mNextTimeout) {
#if DEBUG_RAW_EVENTS
- ALOGD("Timeout expired, latency=%0.3fms", (now - mNextTimeout) * 0.000001f);
+ ALOGD("Timeout expired, latency=%0.3fms", (now - mNextTimeout) * 0.000001f);
#endif
- mNextTimeout = LLONG_MAX;
- timeoutExpiredLocked(now);
+ mNextTimeout = LLONG_MAX;
+ timeoutExpiredLocked(now);
+ }
}
} // release lock
@@ -772,6 +775,8 @@
void InputReader::monitor() {
// Acquire and release the lock to ensure that the reader has not deadlocked.
mLock.lock();
+ mEventHub->wake();
+ mReaderIsAliveCondition.wait(mLock);
mLock.unlock();
// Check the EventHub