Merge "Reduce lock thrashing in native Looper." into gingerbread
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user