MessageQueue.h revision 4fec873a98f7b4380720cd1ad006f74c8cdc73da
1/* 2 * Copyright (C) 2009 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#ifndef ANDROID_MESSAGE_QUEUE_H 18#define ANDROID_MESSAGE_QUEUE_H 19 20#include <stdint.h> 21#include <errno.h> 22#include <sys/types.h> 23 24#include <utils/threads.h> 25#include <utils/Timers.h> 26#include <utils/Looper.h> 27 28#include <gui/DisplayEventReceiver.h> 29 30#include "Barrier.h" 31 32namespace android { 33 34class IDisplayEventConnection; 35class EventThread; 36class SurfaceFlinger; 37 38// --------------------------------------------------------------------------- 39 40class MessageBase : public MessageHandler 41{ 42public: 43 MessageBase(); 44 45 // return true if message has a handler 46 virtual bool handler() = 0; 47 48 // waits for the handler to be processed 49 void wait() const { barrier.wait(); } 50 51protected: 52 virtual ~MessageBase(); 53 54private: 55 virtual void handleMessage(const Message& message); 56 57 mutable Barrier barrier; 58}; 59 60// --------------------------------------------------------------------------- 61 62class MessageQueue { 63 class Handler : public MessageHandler { 64 enum { 65 eventMaskInvalidate = 0x1, 66 eventMaskRefresh = 0x2 67 }; 68 MessageQueue& mQueue; 69 int32_t mEventMask; 70 public: 71 Handler(MessageQueue& queue) : mQueue(queue), mEventMask(0) { } 72 virtual void handleMessage(const Message& message); 73 void dispatchRefresh(); 74 void dispatchInvalidate(); 75 }; 76 77 friend class Handler; 78 79 sp<SurfaceFlinger> mFlinger; 80 sp<Looper> mLooper; 81 sp<EventThread> mEventThread; 82 sp<IDisplayEventConnection> mEvents; 83 sp<BitTube> mEventTube; 84 sp<Handler> mHandler; 85 86 87 static int cb_eventReceiver(int fd, int events, void* data); 88 int eventReceiver(int fd, int events); 89 90public: 91 enum { 92 INVALIDATE = 0, 93 REFRESH = 1, 94 }; 95 96 MessageQueue(); 97 ~MessageQueue(); 98 void init(const sp<SurfaceFlinger>& flinger); 99 void setEventThread(const sp<EventThread>& events); 100 101 void waitMessage(); 102 status_t postMessage(const sp<MessageBase>& message, nsecs_t reltime=0); 103 void invalidate(); 104 void refresh(); 105}; 106 107// --------------------------------------------------------------------------- 108 109}; // namespace android 110 111#endif /* ANDROID_MESSAGE_QUEUE_H */ 112