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
524fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopianvoid MessageQueue::Handler::dispatchRefresh() {
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
584fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopianvoid MessageQueue::Handler::dispatchInvalidate() {
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();
98fe761ab6c72bdcdb8a2cf0df1524f526d8609feeBrian Carlstrom    mLooper->addFd(mEventTube->getFd(), 0, Looper::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) {
107fe761ab6c72bdcdb8a2cf0df1524f526d8609feeBrian Carlstrom            case Looper::POLL_WAKE:
108fe761ab6c72bdcdb8a2cf0df1524f526d8609feeBrian Carlstrom            case Looper::POLL_CALLBACK:
109f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian                continue;
110fe761ab6c72bdcdb8a2cf0df1524f526d8609feeBrian Carlstrom            case Looper::POLL_ERROR:
111fe761ab6c72bdcdb8a2cf0df1524f526d8609feeBrian Carlstrom                ALOGE("Looper::POLL_ERROR");
11253390e1e8c33ebee5bb8100e846f5263ba05ff73Pablo Ceballos                continue;
113fe761ab6c72bdcdb8a2cf0df1524f526d8609feeBrian Carlstrom            case Looper::POLL_TIMEOUT:
11499ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian                // timeout (should not happen)
115f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian                continue;
116f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian            default:
117f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian                // should not happen
118e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block                ALOGE("Looper::pollOnce() returned unknown status %d", ret);
119f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian                continue;
120f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian        }
121f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian    } while (true);
122f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian}
123f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian
124f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopianstatus_t MessageQueue::postMessage(
125f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian        const sp<MessageBase>& messageHandler, nsecs_t relTime)
126f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian{
127f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian    const Message dummyMessage;
128f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian    if (relTime > 0) {
129f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian        mLooper->sendMessageDelayed(relTime, messageHandler, dummyMessage);
130f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian    } else {
131f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian        mLooper->sendMessage(messageHandler, dummyMessage);
132f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian    }
133f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian    return NO_ERROR;
134f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian}
135f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian
1369eb1f0558b5fc78920602afe7bcfa3115bb1f6beMathias Agopian
13799ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopianvoid MessageQueue::invalidate() {
13869a655caef30663403802281210363f643ceb946Mathias Agopian    mEvents->requestNextVsync();
1398aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian}
1408aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian
14199ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopianvoid MessageQueue::refresh() {
1424fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian    mHandler->dispatchRefresh();
143f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian}
144f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian
1458aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopianint MessageQueue::cb_eventReceiver(int fd, int events, void* data) {
1468aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian    MessageQueue* queue = reinterpret_cast<MessageQueue *>(data);
1478aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian    return queue->eventReceiver(fd, events);
1488aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian}
1498aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian
15092dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzynint MessageQueue::eventReceiver(int /*fd*/, int /*events*/) {
1518aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian    ssize_t n;
1528aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian    DisplayEventReceiver::Event buffer[8];
15399ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian    while ((n = DisplayEventReceiver::getEvents(mEventTube, buffer, 8)) > 0) {
1548aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian        for (int i=0 ; i<n ; i++) {
1558aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian            if (buffer[i].header.type == DisplayEventReceiver::DISPLAY_EVENT_VSYNC) {
1564fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian                mHandler->dispatchInvalidate();
1578aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian                break;
1588aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian            }
1598aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian        }
1608aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian    }
1618aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian    return 1;
1628aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian}
1638aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian
164f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian// ---------------------------------------------------------------------------
165f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian
166f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian}; // namespace android
167