Merge "Reduce lock thrashing in native Looper." into gingerbread

This commit is contained in:
Jeff Brown
2010-09-17 17:26:02 -07:00
committed by Android (Google) Code Review

View File

@@ -184,44 +184,50 @@ int Looper::pollInner(int timeoutMillis) {
#if DEBUG_POLL_AND_WAKE #if DEBUG_POLL_AND_WAKE
LOGD("%p ~ pollOnce - handling events from %d fds", this, eventCount); LOGD("%p ~ pollOnce - handling events from %d fds", this, eventCount);
#endif #endif
{ // acquire lock bool acquiredLock = false;
AutoMutex _l(mLock); for (int i = 0; i < eventCount; i++) {
for (int i = 0; i < eventCount; i++) { int fd = eventItems[i].data.fd;
int fd = eventItems[i].data.fd; uint32_t epollEvents = eventItems[i].events;
uint32_t epollEvents = eventItems[i].events; if (fd == mWakeReadPipeFd) {
if (fd == mWakeReadPipeFd) { if (epollEvents & EPOLLIN) {
if (epollEvents & EPOLLIN) {
#if DEBUG_POLL_AND_WAKE #if DEBUG_POLL_AND_WAKE
LOGD("%p ~ pollOnce - awoken", this); LOGD("%p ~ pollOnce - awoken", this);
#endif #endif
char buffer[16]; char buffer[16];
ssize_t nRead; ssize_t nRead;
do { do {
nRead = read(mWakeReadPipeFd, buffer, sizeof(buffer)); nRead = read(mWakeReadPipeFd, buffer, sizeof(buffer));
} while ((nRead == -1 && errno == EINTR) || nRead == sizeof(buffer)); } while ((nRead == -1 && errno == EINTR) || nRead == sizeof(buffer));
} else {
LOGW("Ignoring unexpected epoll events 0x%x on wake read pipe.", epollEvents);
}
} else { } else {
ssize_t requestIndex = mRequests.indexOfKey(fd); LOGW("Ignoring unexpected epoll events 0x%x on wake read pipe.", epollEvents);
if (requestIndex >= 0) { }
int events = 0; } else {
if (epollEvents & EPOLLIN) events |= ALOOPER_EVENT_INPUT; if (! acquiredLock) {
if (epollEvents & EPOLLOUT) events |= ALOOPER_EVENT_OUTPUT; mLock.lock();
if (epollEvents & EPOLLERR) events |= ALOOPER_EVENT_ERROR; acquiredLock = true;
if (epollEvents & EPOLLHUP) events |= ALOOPER_EVENT_HANGUP; }
Response response; ssize_t requestIndex = mRequests.indexOfKey(fd);
response.events = events; if (requestIndex >= 0) {
response.request = mRequests.valueAt(requestIndex); int events = 0;
mResponses.push(response); if (epollEvents & EPOLLIN) events |= ALOOPER_EVENT_INPUT;
} else { if (epollEvents & EPOLLOUT) events |= ALOOPER_EVENT_OUTPUT;
LOGW("Ignoring unexpected epoll events 0x%x on fd %d that is " if (epollEvents & EPOLLERR) events |= ALOOPER_EVENT_ERROR;
"no longer registered.", epollEvents, fd); if (epollEvents & EPOLLHUP) events |= ALOOPER_EVENT_HANGUP;
}
Response response;
response.events = events;
response.request = mRequests.valueAt(requestIndex);
mResponses.push(response);
} else {
LOGW("Ignoring unexpected epoll events 0x%x on fd %d that is "
"no longer registered.", epollEvents, fd);
} }
} }
} }
if (acquiredLock) {
mLock.unlock();
}
for (size_t i = 0; i < mResponses.size(); i++) { for (size_t i = 0; i < mResponses.size(); i++) {
const Response& response = mResponses.itemAt(i); const Response& response = mResponses.itemAt(i);