fix an issue where invalidate/transactions could be missed

Change-Id: I84a1fcba1317b2631f5441de7b7ecd12af5ad022
This commit is contained in:
Mathias Agopian 2011-12-03 14:47:29 -08:00
parent 2228936411
commit be42aef82f
2 changed files with 9 additions and 6 deletions

View File

@ -44,7 +44,7 @@ void MessageBase::handleMessage(const Message&) {
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
MessageQueue::MessageQueue() MessageQueue::MessageQueue()
: mLooper(new Looper(true)) : mLooper(new Looper(true)), mWorkPending(0)
{ {
} }
@ -58,11 +58,11 @@ void MessageQueue::waitMessage() {
int32_t ret = mLooper->pollOnce(-1); int32_t ret = mLooper->pollOnce(-1);
switch (ret) { switch (ret) {
case ALOOPER_POLL_WAKE: case ALOOPER_POLL_WAKE:
// we got woken-up there is work to do in the main loop
return;
case ALOOPER_POLL_CALLBACK: case ALOOPER_POLL_CALLBACK:
// callback was handled, loop again // callback and/or wake
if (android_atomic_and(0, &mWorkPending)) {
return;
}
continue; continue;
case ALOOPER_POLL_TIMEOUT: case ALOOPER_POLL_TIMEOUT:
@ -94,7 +94,9 @@ status_t MessageQueue::postMessage(
} }
status_t MessageQueue::invalidate() { status_t MessageQueue::invalidate() {
mLooper->wake(); if (android_atomic_or(1, &mWorkPending) == 0) {
mLooper->wake();
}
return NO_ERROR; return NO_ERROR;
} }

View File

@ -55,6 +55,7 @@ private:
class MessageQueue { class MessageQueue {
sp<Looper> mLooper; sp<Looper> mLooper;
volatile int32_t mWorkPending;
public: public:
MessageQueue(); MessageQueue();