MessageQueue.cpp revision 99ce5cdeb383216dee95af4d90e47406b0948ea1
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
218aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian#include <binder/IPCThreadState.h>
228aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian
23f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian#include <utils/threads.h>
24f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian#include <utils/Timers.h>
25f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian#include <utils/Log.h>
268aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian
278aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian#include <gui/IDisplayEventConnection.h>
288aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian#include <gui/BitTube.h>
29f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian
30f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian#include "MessageQueue.h"
318aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian#include "EventThread.h"
3299ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian#include "SurfaceFlinger.h"
33f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian
34f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopiannamespace android {
35f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian
36f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian// ---------------------------------------------------------------------------
37f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian
38f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias AgopianMessageBase::MessageBase()
39f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian    : MessageHandler() {
40b6683b58a8cd97e6d527a355bee7ffe9cf8fd6e7Mathias Agopian}
41b6683b58a8cd97e6d527a355bee7ffe9cf8fd6e7Mathias Agopian
42f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias AgopianMessageBase::~MessageBase() {
43b6683b58a8cd97e6d527a355bee7ffe9cf8fd6e7Mathias Agopian}
44b6683b58a8cd97e6d527a355bee7ffe9cf8fd6e7Mathias Agopian
45f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopianvoid MessageBase::handleMessage(const Message&) {
46f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian    this->handler();
47f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian    barrier.open();
48f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian};
49f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian
50b6683b58a8cd97e6d527a355bee7ffe9cf8fd6e7Mathias Agopian// ---------------------------------------------------------------------------
51b6683b58a8cd97e6d527a355bee7ffe9cf8fd6e7Mathias Agopian
5299ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopianvoid MessageQueue::Handler::signalRefresh() {
5399ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian    if ((android_atomic_or(eventMaskRefresh, &mEventMask) & eventMaskRefresh) == 0) {
5499ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian        mQueue.mLooper->sendMessage(this, Message(MessageQueue::REFRESH));
5599ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian    }
5699ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian}
5799ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian
5899ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopianvoid MessageQueue::Handler::signalInvalidate() {
5999ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian    if ((android_atomic_or(eventMaskInvalidate, &mEventMask) & eventMaskInvalidate) == 0) {
6099ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian        mQueue.mLooper->sendMessage(this, Message(MessageQueue::INVALIDATE));
6199ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian    }
6299ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian}
6399ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian
6499ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopianvoid MessageQueue::Handler::handleMessage(const Message& message) {
6599ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian    switch (message.what) {
6699ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian        case INVALIDATE:
6799ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian            android_atomic_and(~eventMaskInvalidate, &mEventMask);
6899ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian            mQueue.mFlinger->onMessageReceived(message.what);
6999ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian            break;
7099ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian        case REFRESH:
7199ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian            android_atomic_and(~eventMaskRefresh, &mEventMask);
7299ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian            mQueue.mFlinger->onMessageReceived(message.what);
7399ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian            break;
7499ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian    }
7599ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian}
7699ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian
7799ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian// ---------------------------------------------------------------------------
7899ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian
79f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias AgopianMessageQueue::MessageQueue()
80f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian{
81f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian}
82f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian
83f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias AgopianMessageQueue::~MessageQueue() {
84f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian}
85f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian
8699ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopianvoid MessageQueue::init(const sp<SurfaceFlinger>& flinger)
8799ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian{
8899ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian    mFlinger = flinger;
8999ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian    mLooper = new Looper(true);
9099ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian    mHandler = new Handler(*this);
9199ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian}
9299ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian
938aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopianvoid MessageQueue::setEventThread(const sp<EventThread>& eventThread)
948aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian{
958aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian    mEventThread = eventThread;
968aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian    mEvents = eventThread->createEventConnection();
978aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian    mEventTube = mEvents->getDataChannel();
988aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian    mLooper->addFd(mEventTube->getFd(), 0, ALOOPER_EVENT_INPUT,
998aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian            MessageQueue::cb_eventReceiver, this);
1008aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian}
1018aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian
102f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopianvoid MessageQueue::waitMessage() {
103f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian    do {
104f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian        IPCThreadState::self()->flushCommands();
105f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian        int32_t ret = mLooper->pollOnce(-1);
106f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian        switch (ret) {
107f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian            case ALOOPER_POLL_WAKE:
108f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian            case ALOOPER_POLL_CALLBACK:
109f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian                continue;
110f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian            case ALOOPER_POLL_ERROR:
111e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block                ALOGE("ALOOPER_POLL_ERROR");
11299ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian            case ALOOPER_POLL_TIMEOUT:
11399ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian                // timeout (should not happen)
114f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian                continue;
115f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian            default:
116f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian                // should not happen
117e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block                ALOGE("Looper::pollOnce() returned unknown status %d", ret);
118f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian                continue;
119f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian        }
120f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian    } while (true);
121f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian}
122f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian
123f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopianstatus_t MessageQueue::postMessage(
124f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian        const sp<MessageBase>& messageHandler, nsecs_t relTime)
125f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian{
126f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian    const Message dummyMessage;
127f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian    if (relTime > 0) {
128f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian        mLooper->sendMessageDelayed(relTime, messageHandler, dummyMessage);
129f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian    } else {
130f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian        mLooper->sendMessage(messageHandler, dummyMessage);
131f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian    }
132f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian    return NO_ERROR;
133f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian}
134f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian
13599ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopianvoid MessageQueue::invalidate() {
13699ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian    mHandler->signalInvalidate();
1378aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian}
1388aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian
13999ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopianvoid MessageQueue::refresh() {
1408aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian    mEvents->requestNextVsync();
141f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian}
142f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian
1438aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopianint MessageQueue::cb_eventReceiver(int fd, int events, void* data) {
1448aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian    MessageQueue* queue = reinterpret_cast<MessageQueue *>(data);
1458aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian    return queue->eventReceiver(fd, events);
1468aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian}
1478aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian
1488aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopianint MessageQueue::eventReceiver(int fd, int events) {
1498aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian    ssize_t n;
1508aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian    DisplayEventReceiver::Event buffer[8];
15199ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian    while ((n = DisplayEventReceiver::getEvents(mEventTube, buffer, 8)) > 0) {
1528aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian        for (int i=0 ; i<n ; i++) {
1538aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian            if (buffer[i].header.type == DisplayEventReceiver::DISPLAY_EVENT_VSYNC) {
15499ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian                mHandler->signalRefresh();
1558aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian                break;
1568aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian            }
1578aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian        }
1588aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian    }
1598aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian    return 1;
1608aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian}
1618aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian
162f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian// ---------------------------------------------------------------------------
163f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian
164f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian}; // namespace android
165