summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--services/input/InputDispatcher.cpp28
1 files changed, 20 insertions, 8 deletions
diff --git a/services/input/InputDispatcher.cpp b/services/input/InputDispatcher.cpp
index 291a816..a63b6f5 100644
--- a/services/input/InputDispatcher.cpp
+++ b/services/input/InputDispatcher.cpp
@@ -2043,18 +2043,30 @@ int InputDispatcher::handleReceiveCallback(int fd, int events, void* data) {
return 1;
}
- bool handled = false;
- status_t status = connection->inputPublisher.receiveFinishedSignal(&handled);
- if (!status) {
- nsecs_t currentTime = now();
+ nsecs_t currentTime = now();
+ bool gotOne = false;
+ status_t status;
+ for (;;) {
+ bool handled = false;
+ status = connection->inputPublisher.receiveFinishedSignal(&handled);
+ if (status) {
+ break;
+ }
d->finishDispatchCycleLocked(currentTime, connection, handled);
+ gotOne = true;
+ }
+ if (gotOne) {
d->runCommandsLockedInterruptible();
- return 1;
+ if (status == WOULD_BLOCK) {
+ return 1;
+ }
}
- ALOGE("channel '%s' ~ Failed to receive finished signal. status=%d",
- connection->getInputChannelName(), status);
- notify = true;
+ notify = status != DEAD_OBJECT || !connection->monitor;
+ if (notify) {
+ ALOGE("channel '%s' ~ Failed to receive finished signal. status=%d",
+ connection->getInputChannelName(), status);
+ }
} else {
// Monitor channels are never explicitly unregistered.
// We do it automatically when the remote endpoint is closed so don't warn