上一篇总结了chromium进程的启动,接下来就看线程的消息处理,这里的线程包含进程的主线程。
消息处理是由base::MessageLoop中实现,消息中的任务和定时器都是异步事件的。
主要如下几点:
1、消息的类型分类
2、延时处理的消息是如何实现
一、消息分类
chromium主要将消息类型如下定义:(chromium//src/base/message_loop/message_loop.h 112行)
1 enum Type { 2 TYPE_DEFAULT, 3 TYPE_UI, 4 TYPE_CUSTOM, 5 TYPE_IO, 6 #if defined(OS_ANDROID) 7 TYPE_JAVA, 8 #endif // defined(OS_ANDROID) 9 };
1.TYPE_DEFAULT:
处理chromium定义的Task(闭包代码块)和定时器任务
2.TYPE_UI:
除了TYPE_DEFAULT定义的范围,还支持原生的UI事件消息(比如用户操作的窗口消息),MessageLoopForUI类
3.TYPE_IO:
除了TYPE_DEFAULT定义的范围,还支持异步IO的事件消息,MessageLoopForIO类
4.TYPE_JAVA
是Android平台的特有的消息消息,因为Android里,有java消息和native消息分层,native消息与java消息交互,java消息与应用程序交互,可以看做java消息接管了native消息。
5.TYPE_CUSTOM
定制消息,比较少见使用。
消息类型的不同也就会创建不同的MessagePump。对于UI消息,不同的平台也会有不同的实现。在chromium//src/base/message_loop/message_loop.cc 166行
1 // static 2 std::unique_ptr<MessagePump> MessageLoop::CreateMessagePumpForType(Type type) { 3 // TODO(rvargas): Get rid of the OS guards. 4 #if defined(USE_GLIB) && !defined(OS_NACL) 5 using MessagePumpForUI = MessagePumpGlib; 6 #elif (defined(OS_LINUX) && !defined(OS_NACL)) || defined(OS_BSD) 7 using MessagePumpForUI = MessagePumpLibevent; 8 #elif defined(OS_FUCHSIA) 9 using MessagePumpForUI = MessagePumpFuchsia; 10 #endif 11 12 #if defined(OS_IOS) || defined(OS_MACOSX) 13 #define MESSAGE_PUMP_UI std::unique_ptr<MessagePump>(MessagePumpMac::Create()) 14 #elif defined(OS_NACL) || defined(OS_AIX) 15 // Currently NaCl and AIX don't have a UI MessageLoop. 16 // TODO(abarth): Figure out if we need this. 17 #define MESSAGE_PUMP_UI std::unique_ptr<MessagePump>() 18 #else 19 #define MESSAGE_PUMP_UI std::unique_ptr<MessagePump>(new MessagePumpForUI()) 20 #endif 21 22 #if defined(OS_MACOSX) 23 // Use an OS native runloop on Mac to support timer coalescing. 24 #define MESSAGE_PUMP_DEFAULT \ 25 std::unique_ptr<MessagePump>(new MessagePumpCFRunLoop()) 26 #else 27 #define MESSAGE_PUMP_DEFAULT \ 28 std::unique_ptr<MessagePump>(new MessagePumpDefault()) 29 #endif 30 31 if (type == MessageLoop::TYPE_UI) { 32 if (message_pump_for_ui_factory_) 33 return message_pump_for_ui_factory_(); 34 return MESSAGE_PUMP_UI; 35 } 36 if (type == MessageLoop::TYPE_IO) 37 return std::unique_ptr<MessagePump>(new MessagePumpForIO()); 38 39 #if defined(OS_ANDROID) 40 if (type == MessageLoop::TYPE_JAVA) 41 return std::unique_ptr<MessagePump>(new MessagePumpForUI()); 42 #endif 43 44 DCHECK_EQ(MessageLoop::TYPE_DEFAULT, type); 45 return MESSAGE_PUMP_DEFAULT; 46 }