Ensure input dispatcher and native looper handles EINTR.

Change-Id: I0a42db5f273b9bfe4ab174e4ee65d5d852f9f6bc
This commit is contained in:
Jeff Brown 2010-09-16 17:04:52 -07:00
parent 3435d3bb55
commit f67f299036
2 changed files with 19 additions and 6 deletions

View File

@ -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);

View File

@ -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);