- 1. surface flinger thread:
- while(true) {
- checkEventAndSendSignal();
- doSomeThing();
- if (canDraw) {
- swapBuffer();
- }
- }
- event function
- checkEventAndSendSignal() {
- if (wait_for_sleep returned) {
- canDraw = false;
- ();
- }
- if (wait_for_wakeup returned) {
- canDraw = true;
- }
- }
- function
- swapBuffer() {
- .....
- ioctl(egl_native_window_t::fd, FBIOPUT_VSCREENINFO, &mInfo)
- ....
- }
- thread
- while(true) {
- wait_for_sleep();
- sendSleepReturnEvent();
- ();
- wait_for_wakeup();
- sendWakeupReturnEvent();
- }
当屏幕可用时,kernel会block getEvent线程在wait_for_sleep(read(wait_for_fb_sleep file))调用上,直到屏幕不可用(用户关闭屏幕,变黑);当屏幕不可用(挂起),kernel会block getEvent线程在wait_for_wakeup(read(wait_for_fb_wakeup file))调用上,直到屏幕可用。
在挂起屏幕前(wait_for_wakeup)mBarrier用来同步surfaceflinger线程画完上次循环未完成的framebuffer