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