【架构分析】Fuchsia Loop消息处理详解

目录

消息循环Message Loop

Message Loop工作原理


消息循环Message Loop

Fuchsia应用程序通过libasync-loop创建和使用消息循环Message Loop, 应用程序必须拥有Message Loop才能正常工作,比如跨进程IPC调用. 为了描述更具体, 本文以下面这个main函数说明Message Loop的运行原理.

int main(int argc, const char** argv) {
  async::Loop loop(&kAsyncLoopConfigAttachToThread);

  ......

  loop.Run();
  return 0;
}

Message Loop工作原理

【架构分析】Fuchsia Loop消息处理详解
Message Loop主要类图​​​

Message Loop主要分2个库

  • libasync-loop (fuchsia/zircon/system/ulib/async-loop) 包装和实现了消息循环Loop类
  • libasync (fuchsia/zircon/system/ulib/async) 包装和实现了异步等待Wait类
【架构分析】Fuchsia Loop消息处理详解
Message Loop工作时序图

Message Loop的工作过程包括4个主要步骤,详细的时序分析参考上图

  • Loop类初始化过程即main函数的 
async::Loop loop(&kAsyncLoopConfigAttachToThread);
  • 主线程消息循环过程即main函数的
loop.Run();
  • 应用程序通过某些类创建Wait实例注册需要等待的对象以及回调通知函数
  • 应用程序通过某些包装类调用了Wait的Begin开始异步等待对象上出现期望的SIGNAL并触发回调通知 (比如FIDL IPC过程中通过MessageReader调用Bind方法调用async_begin_wait等待channel对象有数据可读,然后回调MessageReader::CallHandler来处理)