Optimize dispatcher for back-to-back finished signals.
Minor tweak to the dispatcher to handle as many finished signals in a receive callback as possible instead of going back to the Looper and waiting for the next poll() to hit the callback again. This is part of a series of changes to improve input system pipelining. Bug: 5963420 Change-Id: I8471107371693e21ce8ce7cca1e8d79ba4ca2351
This commit is contained in:
@@ -2043,18 +2043,30 @@ int InputDispatcher::handleReceiveCallback(int fd, int events, void* data) {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool handled = false;
|
nsecs_t currentTime = now();
|
||||||
status_t status = connection->inputPublisher.receiveFinishedSignal(&handled);
|
bool gotOne = false;
|
||||||
if (!status) {
|
status_t status;
|
||||||
nsecs_t currentTime = now();
|
for (;;) {
|
||||||
|
bool handled = false;
|
||||||
|
status = connection->inputPublisher.receiveFinishedSignal(&handled);
|
||||||
|
if (status) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
d->finishDispatchCycleLocked(currentTime, connection, handled);
|
d->finishDispatchCycleLocked(currentTime, connection, handled);
|
||||||
|
gotOne = true;
|
||||||
|
}
|
||||||
|
if (gotOne) {
|
||||||
d->runCommandsLockedInterruptible();
|
d->runCommandsLockedInterruptible();
|
||||||
return 1;
|
if (status == WOULD_BLOCK) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ALOGE("channel '%s' ~ Failed to receive finished signal. status=%d",
|
notify = status != DEAD_OBJECT || !connection->monitor;
|
||||||
connection->getInputChannelName(), status);
|
if (notify) {
|
||||||
notify = true;
|
ALOGE("channel '%s' ~ Failed to receive finished signal. status=%d",
|
||||||
|
connection->getInputChannelName(), status);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// Monitor channels are never explicitly unregistered.
|
// Monitor channels are never explicitly unregistered.
|
||||||
// We do it automatically when the remote endpoint is closed so don't warn
|
// We do it automatically when the remote endpoint is closed so don't warn
|
||||||
|
|||||||
Reference in New Issue
Block a user