blob: ea29e7ef729caee488ff9c15f3832ba7b51eb998 [file] [log] [blame]
Mathias Agopianf1d8e872009-04-20 19:39:12 -07001/*
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>
Mathias Agopianf61c57f2011-11-23 16:49:10 -080026#include <utils/Looper.h>
Mathias Agopianf1d8e872009-04-20 19:39:12 -070027
Mathias Agopian8aedd472012-01-24 16:39:14 -080028#include <gui/DisplayEventReceiver.h>
29
Mathias Agopianbb641242010-05-18 17:06:55 -070030#include "Barrier.h"
Mathias Agopianf1d8e872009-04-20 19:39:12 -070031
32namespace android {
33
Mathias Agopian8aedd472012-01-24 16:39:14 -080034class IDisplayEventConnection;
35class EventThread;
Mathias Agopian99ce5cd2012-01-31 18:24:27 -080036class SurfaceFlinger;
Mathias Agopian8aedd472012-01-24 16:39:14 -080037
Mathias Agopianf1d8e872009-04-20 19:39:12 -070038// ---------------------------------------------------------------------------
39
Mathias Agopianf61c57f2011-11-23 16:49:10 -080040class MessageBase : public MessageHandler
Mathias Agopianf1d8e872009-04-20 19:39:12 -070041{
42public:
Mathias Agopianf61c57f2011-11-23 16:49:10 -080043 MessageBase();
Mathias Agopianf1d8e872009-04-20 19:39:12 -070044
45 // return true if message has a handler
Mathias Agopianf61c57f2011-11-23 16:49:10 -080046 virtual bool handler() = 0;
Mathias Agopianbb641242010-05-18 17:06:55 -070047
48 // waits for the handler to be processed
49 void wait() const { barrier.wait(); }
Mathias Agopianbb641242010-05-18 17:06:55 -070050
Mathias Agopianf1d8e872009-04-20 19:39:12 -070051protected:
Mathias Agopianf61c57f2011-11-23 16:49:10 -080052 virtual ~MessageBase();
Mathias Agopianf1d8e872009-04-20 19:39:12 -070053
54private:
Mathias Agopianf61c57f2011-11-23 16:49:10 -080055 virtual void handleMessage(const Message& message);
Mathias Agopianf1d8e872009-04-20 19:39:12 -070056
Mathias Agopianf61c57f2011-11-23 16:49:10 -080057 mutable Barrier barrier;
58};
Mathias Agopianf1d8e872009-04-20 19:39:12 -070059
60// ---------------------------------------------------------------------------
61
Mathias Agopianf61c57f2011-11-23 16:49:10 -080062class MessageQueue {
Mathias Agopian99ce5cd2012-01-31 18:24:27 -080063 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 signalRefresh();
74 void signalInvalidate();
75 };
76
77 friend class Handler;
78
79 sp<SurfaceFlinger> mFlinger;
Mathias Agopianf61c57f2011-11-23 16:49:10 -080080 sp<Looper> mLooper;
Mathias Agopian8aedd472012-01-24 16:39:14 -080081 sp<EventThread> mEventThread;
82 sp<IDisplayEventConnection> mEvents;
83 sp<BitTube> mEventTube;
Mathias Agopian99ce5cd2012-01-31 18:24:27 -080084 sp<Handler> mHandler;
85
Mathias Agopian8aedd472012-01-24 16:39:14 -080086
87 static int cb_eventReceiver(int fd, int events, void* data);
88 int eventReceiver(int fd, int events);
Mathias Agopianf1d8e872009-04-20 19:39:12 -070089
Mathias Agopianf61c57f2011-11-23 16:49:10 -080090public:
Mathias Agopian99ce5cd2012-01-31 18:24:27 -080091 enum {
92 INVALIDATE = 0,
93 REFRESH = 1,
94 };
95
Mathias Agopianf1d8e872009-04-20 19:39:12 -070096 MessageQueue();
97 ~MessageQueue();
Mathias Agopian99ce5cd2012-01-31 18:24:27 -080098 void init(const sp<SurfaceFlinger>& flinger);
Mathias Agopian8aedd472012-01-24 16:39:14 -080099 void setEventThread(const sp<EventThread>& events);
Mathias Agopianf1d8e872009-04-20 19:39:12 -0700100
Mathias Agopianf61c57f2011-11-23 16:49:10 -0800101 void waitMessage();
102 status_t postMessage(const sp<MessageBase>& message, nsecs_t reltime=0);
Mathias Agopian99ce5cd2012-01-31 18:24:27 -0800103 void invalidate();
104 void refresh();
Mathias Agopianf1d8e872009-04-20 19:39:12 -0700105};
106
107// ---------------------------------------------------------------------------
108
109}; // namespace android
110
111#endif /* ANDROID_MESSAGE_QUEUE_H */