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