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 32 namespace android { 33 34 class IDisplayEventConnection; 35 class EventThread; 36 class SurfaceFlinger; 37 38 // --------------------------------------------------------------------------- 39 40 class MessageBase : public MessageHandler 41 { 42 public: 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 51 protected: 52 virtual ~MessageBase(); 53 54 private: 55 virtual void handleMessage(const Message& message); 56 57 mutable Barrier barrier; 58 }; 59 60 // --------------------------------------------------------------------------- 61 62 class MessageQueue { 63 class Handler : public MessageHandler { 64 enum { 65 eventMaskInvalidate = 0x1, 66 eventMaskRefresh = 0x2, 67 eventMaskTransaction = 0x4 68 }; 69 MessageQueue& mQueue; 70 int32_t mEventMask; 71 public: 72 Handler(MessageQueue& queue) : mQueue(queue), mEventMask(0) { } 73 virtual void handleMessage(const Message& message); 74 void dispatchRefresh(); 75 void dispatchInvalidate(); 76 void dispatchTransaction(); 77 }; 78 79 friend class Handler; 80 81 sp<SurfaceFlinger> mFlinger; 82 sp<Looper> mLooper; 83 sp<EventThread> mEventThread; 84 sp<IDisplayEventConnection> mEvents; 85 sp<BitTube> mEventTube; 86 sp<Handler> mHandler; 87 88 89 static int cb_eventReceiver(int fd, int events, void* data); 90 int eventReceiver(int fd, int events); 91 92 public: 93 enum { 94 INVALIDATE = 0, 95 REFRESH = 1, 96 TRANSACTION = 2 97 }; 98 99 MessageQueue(); 100 ~MessageQueue(); 101 void init(const sp<SurfaceFlinger>& flinger); 102 void setEventThread(const sp<EventThread>& events); 103 104 void waitMessage(); 105 status_t postMessage(const sp<MessageBase>& message, nsecs_t reltime=0); 106 107 // sends INVALIDATE message at next VSYNC 108 void invalidate(); 109 // sends REFRESH message at next VSYNC 110 void refresh(); 111 // sends TRANSACTION message immediately 112 void invalidateTransactionNow(); 113 }; 114 115 // --------------------------------------------------------------------------- 116 117 }; // namespace android 118 119 #endif /* ANDROID_MESSAGE_QUEUE_H */ 120