From f67f29903680e7a33af020dbeb80697ad619b26e Mon Sep 17 00:00:00 2001 From: Jeff Brown Date: Thu, 16 Sep 2010 17:04:52 -0700 Subject: [PATCH] Ensure input dispatcher and native looper handles EINTR. Change-Id: I0a42db5f273b9bfe4ab174e4ee65d5d852f9f6bc --- libs/ui/InputTransport.cpp | 11 +++++++++-- libs/utils/Looper.cpp | 14 ++++++++++---- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/libs/ui/InputTransport.cpp b/libs/ui/InputTransport.cpp index 4c402dc02..2c6346ebe 100644 --- a/libs/ui/InputTransport.cpp +++ b/libs/ui/InputTransport.cpp @@ -131,7 +131,10 @@ status_t InputChannel::openInputChannelPair(const String8& name, } status_t InputChannel::sendSignal(char signal) { - ssize_t nWrite = ::write(mSendPipeFd, & signal, 1); + ssize_t nWrite; + do { + nWrite = ::write(mSendPipeFd, & signal, 1); + } while (nWrite == -1 && errno == EINTR); if (nWrite == 1) { #if DEBUG_CHANNEL_SIGNALS @@ -147,7 +150,11 @@ status_t InputChannel::sendSignal(char signal) { } status_t InputChannel::receiveSignal(char* outSignal) { - ssize_t nRead = ::read(mReceivePipeFd, outSignal, 1); + ssize_t nRead; + do { + nRead = ::read(mReceivePipeFd, outSignal, 1); + } while (nRead == -1 && errno == EINTR); + if (nRead == 1) { #if DEBUG_CHANNEL_SIGNALS LOGD("channel '%s' ~ received signal '%c'", mName.string(), *outSignal); diff --git a/libs/utils/Looper.cpp b/libs/utils/Looper.cpp index fd287da51..4aa50d675 100644 --- a/libs/utils/Looper.cpp +++ b/libs/utils/Looper.cpp @@ -162,9 +162,11 @@ int Looper::pollInner(int timeoutMillis) { struct epoll_event eventItems[EPOLL_MAX_EVENTS]; int eventCount = epoll_wait(mEpollFd, eventItems, EPOLL_MAX_EVENTS, timeoutMillis); if (eventCount < 0) { - if (errno != EINTR) { - LOGW("Poll failed with an unexpected error, errno=%d", errno); + if (errno == EINTR) { + return ALOOPER_POLL_WAKE; } + + LOGW("Poll failed with an unexpected error, errno=%d", errno); return ALOOPER_POLL_ERROR; } @@ -196,7 +198,7 @@ int Looper::pollInner(int timeoutMillis) { ssize_t nRead; do { nRead = read(mWakeReadPipeFd, buffer, sizeof(buffer)); - } while (nRead == sizeof(buffer)); + } while ((nRead == -1 && errno == EINTR) || nRead == sizeof(buffer)); } else { LOGW("Ignoring unexpected epoll events 0x%x on wake read pipe.", epollEvents); } @@ -272,7 +274,11 @@ void Looper::wake() { LOGD("%p ~ wake", this); #endif - ssize_t nWrite = write(mWakeWritePipeFd, "W", 1); + ssize_t nWrite; + do { + nWrite = write(mWakeWritePipeFd, "W", 1); + } while (nWrite == -1 && errno == EINTR); + if (nWrite != 1) { if (errno != EAGAIN) { LOGW("Could not write wake signal, errno=%d", errno);