Android SurfaceFlinger服務(四) ----- 消息機制MessageQueue
阿新 • • 發佈:2018-06-20
events on() inpu str lB 取消 onf CA andro
SurfaceFlinger有著自己的消息隊列MessageQueue,用來處理顯示相關的消息,比如Vsync消息。
相關文件:
- frameworks/native/services/surfaceflinger/MessageQueue.h
- frameworks/native/services/surfaceflinger/MessageQueue.cpp
類MessageQueue和Handler定義在MessageQueue.h文件中,代碼如下:
class MessageQueue { // 類Handler定義也在這裏 class Handler : public MessageHandler { enum { eventMaskInvalidate = 0x1, eventMaskRefresh = 0x2, eventMaskTransaction = 0x4 }; MessageQueue& mQueue; int32_t mEventMask; public: Handler(MessageQueue& queue) : mQueue(queue), mEventMask(0) { } virtual void handleMessage(const Message& message); void dispatchRefresh(); void dispatchInvalidate(); void dispatchTransaction(); }; friend class Handler; sp<SurfaceFlinger> mFlinger; sp<Looper> mLooper; sp<EventThread> mEventThread; sp<IDisplayEventConnection> mEvents; sp<BitTube> mEventTube; sp<Handler> mHandler; static int cb_eventReceiver(int fd, int events, void* data); int eventReceiver(int fd, int events); public: enum { INVALIDATE = 0, REFRESH = 1, TRANSACTION = 2 }; MessageQueue(); ~MessageQueue(); void init(const sp<SurfaceFlinger>& flinger); void setEventThread(const sp<EventThread>& events); void waitMessage(); status_t postMessage(const sp<MessageBase>& message, nsecs_t reltime=0); // sends INVALIDATE message at next VSYNC void invalidate(); // sends REFRESH message at next VSYNC void refresh(); // sends TRANSACTION message immediately void invalidateTransactionNow(); };
- mLooper線程循環體,主要用於取消息
- mHander消息處理類
- mEventThread、mEvents、mEventTube主要與Vsync消息的分發有關
SurfaceFlinger類中有一個MessageQueue類型的成員變量,定義如下:
// these are thread safe
mutable MessageQueue mEventQueue;
- 因些在SurfaceFlinger被構造的時候就構造一個mEventQueue。
void SurfaceFlinger::onFirstRef() { mEventQueue.init(this); }
- 調用MessageQueue的init函數進行初始化
void MessageQueue::init(const sp<SurfaceFlinger>& flinger)
{
mFlinger = flinger;
mLooper = new Looper(true);
mHandler = new Handler(*this);
}
- 初始化mFlinger、mLooper、mHandler三個成員變量
void SurfaceFlinger::init() { ...... mSFEventThread = new EventThread(sfVsyncSrc); mEventQueue.setEventThread(mSFEventThread); ...... }
- 在SurfaceFlinger的init函數中調用MessageQueue的setEventThread函數
void MessageQueue::setEventThread(const sp<EventThread>& eventThread)
{
mEventThread = eventThread;
mEvents = eventThread->createEventConnection();
mEventTube = mEvents->getDataChannel();
mLooper->addFd(mEventTube->getFd(), 0, Looper::EVENT_INPUT,
MessageQueue::cb_eventReceiver, this);
}
- 設置mEventThread、mEvents、mEventTube,並且添加文件句柄到mLooper
消息的監聽主要在SurfaceFlinger的run函數裏
void SurfaceFlinger::run() {
do {
waitForEvent();
} while (true);
}
- 死循環一直監聽消息
- 調用waitForEvent進行等待消息事件
void SurfaceFlinger::waitForEvent() {
mEventQueue.waitMessage();
}
- 調用MessageQueue的waitMessage等待消息
void MessageQueue::waitMessage() {
do {
IPCThreadState::self()->flushCommands();
int32_t ret = mLooper->pollOnce(-1);
switch (ret) {
case Looper::POLL_WAKE:
case Looper::POLL_CALLBACK:
continue;
case Looper::POLL_ERROR:
ALOGE("Looper::POLL_ERROR");
case Looper::POLL_TIMEOUT:
// timeout (should not happen)
continue;
default:
// should not happen
ALOGE("Looper::pollOnce() returned unknown status %d", ret);
continue;
}
} while (true);
}
- waitMessage主要通過調用mLooper的pollOnce方法來監聽消息
Android SurfaceFlinger服務(四) ----- 消息機制MessageQueue