RedWorker是SPICE协议的架构的核心,该线程处理所有的display/cursor相关消息。RedWorker主函数red_worker_main()使用了异步事件处理框架,事件来源有:
1、驱动消息,包括绘图指令、Surface创建销毁、UpdateArea等等。
2、客户端display/cursor信道连接、断链
3、migrate消息
4、socket事件
5、定时器
red_worker.c中的register_callbacks()函数,这里是为控制面和驱动消息注册回调函数。具体的消息类型可以去看看。最新版本的SPICE对red_worker作了大幅重构,代码可维护性上升了不少,但是流程、算法和功能不受影响,本文以老版本为基准来分析。
首先发生的流程是surface_create。显示驱动加载时触发primary_surface创建。offscreen创建流程与primary surface略有差异。red_create_surface()是主要流程,初始化了worker->surfaces[],这个RedSurface结构体非常重要,对于一个surface上的所有draw command会顺序添加到RedSurface 上的current_list结构上。
第二步客户端display信道连接,对RED_WORKER_MESSAGE_DISPLAY_CONNECT消息的处理。这里创建了DCC(display channel client)数据结构,初始化了编解码器,并在on_new_display_channel_client()传送了第一副主屏图像到客户端。每个DCC都有一个pipe,发往客户端的所有消息都需要先挂在pipe上,当red_push()时候会从pipe tail取出来编码后发送。
无论客户端是否连接,主循环都每次都回调用red_process