主事件循環
qemu是基於glib事件循環機制
main ->
| -> qemu_init_main_loop : 初始化創建了兩個事件源,分別是qemu_aio_context和iohandler_ctx
main_loop : 是一個while循環
-> main_loop_wait
-> os_host_main_loop_wait
| -> glib_pollfds_fil -> g_main_context_prepare -> g_main_context_query:檢索事件源中待監控的fd集合
qemu_poll_ns
| -> g_poll(glib庫中實現) : 監控fd狀態
glib_pollfds_poll : 有事件發生,準備開始執行回調
| -> g_main_context_check -> aio_ctx_check -> aio_pending : 有關注的讀寫狀態準備好則返回True,執行dispatch
g_main_context_dispatch -> aio_dispatch -> aio_dispatch_handlers : 遍歷AioConetx中的AioHandler節 點,根據讀寫狀態調用io_read或者io_write,對於網絡tap設備,則對應最終的tap_send和tap_writable
glib事件循環狀態機如下: