SPICE协议之RedWorker线程

本文深入剖析SPICE协议中的RedWorker线程,详述其在处理display/cursor相关消息中的核心功能,包括surface创建、DCC连接、消息处理等。关键在于渲染树的构建与维护,用于重复数据消除和流媒体管理。渲染树通过red_current_add()函数进行操作,涉及region_test()和exclude_region()等消除重叠区域的过程。尽管SPICE在优化方面存在局限,但其高效的消息处理和零拷贝发送机制仍具有借鉴价值。
摘要由CSDN通过智能技术生成

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

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值