MessageQueue.cpp revision f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9
1f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian/* 2f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian * Copyright (C) 2009 The Android Open Source Project 3f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian * 4f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian * Licensed under the Apache License, Version 2.0 (the "License"); 5f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian * you may not use this file except in compliance with the License. 6f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian * You may obtain a copy of the License at 7f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian * 8f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian * http://www.apache.org/licenses/LICENSE-2.0 9f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian * 10f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian * Unless required by applicable law or agreed to in writing, software 11f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian * distributed under the License is distributed on an "AS IS" BASIS, 12f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian * See the License for the specific language governing permissions and 14f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian * limitations under the License. 15f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian */ 16f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian 17f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian#include <stdint.h> 18f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian#include <errno.h> 19f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian#include <sys/types.h> 20f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian 21f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian#include <utils/threads.h> 22f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian#include <utils/Timers.h> 23f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian#include <utils/Log.h> 24310f8da0c3122ed5419db8f12a6e98d3188325b2Mathias Agopian#include <binder/IPCThreadState.h> 25f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian 26f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian#include "MessageQueue.h" 27f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian 28f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopiannamespace android { 29f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian 30f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian// --------------------------------------------------------------------------- 31f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian 32f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias AgopianMessageBase::MessageBase() 33f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian : MessageHandler() { 34b6683b58a8cd97e6d527a355bee7ffe9cf8fd6e7Mathias Agopian} 35b6683b58a8cd97e6d527a355bee7ffe9cf8fd6e7Mathias Agopian 36f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias AgopianMessageBase::~MessageBase() { 37b6683b58a8cd97e6d527a355bee7ffe9cf8fd6e7Mathias Agopian} 38b6683b58a8cd97e6d527a355bee7ffe9cf8fd6e7Mathias Agopian 39f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopianvoid MessageBase::handleMessage(const Message&) { 40f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian this->handler(); 41f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian barrier.open(); 42f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian}; 43f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian 44b6683b58a8cd97e6d527a355bee7ffe9cf8fd6e7Mathias Agopian// --------------------------------------------------------------------------- 45b6683b58a8cd97e6d527a355bee7ffe9cf8fd6e7Mathias Agopian 46f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias AgopianMessageQueue::MessageQueue() 47f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian : mLooper(new Looper(true)), 48f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian mInvalidatePending(0) 49f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian{ 50f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian} 51f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian 52f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias AgopianMessageQueue::~MessageQueue() { 53f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian} 54f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian 55f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopianvoid MessageQueue::waitMessage() { 56f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian do { 57f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian // handle invalidate events first 58f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian if (android_atomic_and(0, &mInvalidatePending) != 0) 59f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian break; 60f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian 61f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian IPCThreadState::self()->flushCommands(); 62b6683b58a8cd97e6d527a355bee7ffe9cf8fd6e7Mathias Agopian 63f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian int32_t ret = mLooper->pollOnce(-1); 64f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian switch (ret) { 65f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian case ALOOPER_POLL_WAKE: 66f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian // we got woken-up there is work to do in the main loop 67f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian continue; 68f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian 69f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian case ALOOPER_POLL_CALLBACK: 70f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian // callback was handled, loop again 71f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian continue; 72f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian 73f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian case ALOOPER_POLL_TIMEOUT: 74f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian // timeout (should not happen) 75f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian continue; 76f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian 77f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian case ALOOPER_POLL_ERROR: 78f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian LOGE("ALOOPER_POLL_ERROR"); 79f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian continue; 80f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian 81f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian default: 82f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian // should not happen 83f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian LOGE("Looper::pollOnce() returned unknown status %d", ret); 84f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian continue; 85f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian } 86f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian } while (true); 87f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian} 88f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian 89f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopianstatus_t MessageQueue::postMessage( 90f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian const sp<MessageBase>& messageHandler, nsecs_t relTime) 91f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian{ 92f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian const Message dummyMessage; 93f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian if (relTime > 0) { 94f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian mLooper->sendMessageDelayed(relTime, messageHandler, dummyMessage); 95f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian } else { 96f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian mLooper->sendMessage(messageHandler, dummyMessage); 97f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian } 98f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian return NO_ERROR; 99f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian} 100f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian 101f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopianstatus_t MessageQueue::invalidate() { 102f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian android_atomic_or(1, &mInvalidatePending); 103f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian mLooper->wake(); 104f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian return NO_ERROR; 105f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian} 106f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian 107f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian// --------------------------------------------------------------------------- 108f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian 109f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian}; // namespace android 110