3. SurfaceFlinger和EventThread的工作流程说明
在SF的readyToRun函数中,将通过MesssageQueue的setEventThread函数建立SF和ET的关系。看看代码吧:
void MessageQueue::setEventThread(const sp<EventThread>& eventThread)
{
mEventThread = eventThread;
mEvents = eventThread->createEventConnection();
mEventTube = mEvents->getDataChannel();
mLooper->addFd(mEventTube->getFd(), 0, ALOOPER_EVENT_INPUT,
MessageQueue::cb_eventReceiver, this);
}
也就是说,当EventThread有什么鸟事的时候,都会通过cb_eventReceiver回调到SF线程。
注意:JB以前,Android老是喜欢用pipe作为进程间通信的手段,现在改成socketpair了。这是一个很大的变化。所以,会网络编程的同学可以happy一下了。不会的淫,也无所谓,反正是把socket当pipe来使,都是IPC通信手段,你管它用得是什么呢!
EventThread的requestSync被调用后,会触发EventThread的线程通过Connection发送一个消息给SF所在的线程,即刚才那个cb_eventReceiver被调用,图4是此后的工作流程。(SF系统现在变得也是磨磨唧唧了,不懂POSIX编程屌丝们,你们无论如何得花点功夫研究了。)