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/InputDispatcher.cpp b/services/input/InputDispatcher.cpp
index 9f09062..ad64ccd 100644
--- a/services/input/InputDispatcher.cpp
+++ b/services/input/InputDispatcher.cpp
@@ -238,6 +238,8 @@
     nsecs_t nextWakeupTime = LONG_LONG_MAX;
     { // acquire lock
         AutoMutex _l(mLock);
+        mDispatcherIsAliveCondition.broadcast();
+
         dispatchOnceInnerLocked(&nextWakeupTime);
 
         if (runCommandsLockedInterruptible()) {
@@ -4086,6 +4088,8 @@
 void InputDispatcher::monitor() {
     // Acquire and release the lock to ensure that the dispatcher has not deadlocked.
     mLock.lock();
+    mLooper->wake();
+    mDispatcherIsAliveCondition.wait(mLock);
     mLock.unlock();
 }
 
diff --git a/services/input/InputDispatcher.h b/services/input/InputDispatcher.h
index 1478d67..a1d42e1 100644
--- a/services/input/InputDispatcher.h
+++ b/services/input/InputDispatcher.h
@@ -862,6 +862,8 @@
 
     Mutex mLock;
 
+    Condition mDispatcherIsAliveCondition;
+
     sp<Looper> mLooper;
 
     EventEntry* mPendingEvent;
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
diff --git a/services/input/InputReader.h b/services/input/InputReader.h
index a122c97..ad89a22 100644
--- a/services/input/InputReader.h
+++ b/services/input/InputReader.h
@@ -363,6 +363,8 @@
 private:
     Mutex mLock;
 
+    Condition mReaderIsAliveCondition;
+
     sp<EventHubInterface> mEventHub;
     sp<InputReaderPolicyInterface> mPolicy;
     sp<QueuedInputListener> mQueuedListener;