Spice代码分析(三)——red_worker: red_init

        Spice 的图形子系统是最Spice最核心也是最复杂的一块,它不像其他的几个子系统由spice server 主进程来处理,而是有一个单独的线程处理,而且与主进程是并行运行的,负责这个处理的线程就是Red worker。具体来说,redworker负责以下的处理:

1)        处理QXL设备命令(如画,更新,光标处理等);

2)        处理从Dispatcher接收到的消息;

3)        显示和光标的通道创建、维护和通信;

4)        图像压缩(用quic, lz和 glz);

5)        视频流处理;

6)        用Cario或OpenGL渲染图形——画布(canvas)和表面(surface)等;

7)        命令环(ring)的操作;

8)        与spice client的显示和光标通道的信息交互

 

Red worker有很多处理,接下来阅读一些主要的方法,今天先看看red_init:

1.1Red_worker.c: red_init

static void red_init(RedWorker *worker, WorkerInitData *init_data)

dispatcher_get_recv_fd

从dispatcher那里拿来recv_fd作为red_worker之后可以发送消息给dispatcher的套接字(如在red_worker创建完display channel就通过这个套接字发消息给了dispatcher)

register_callbacks

 

注册一系列的回调函数用以处理dispatcher发过来的消息,dispatcher用dispatcher_send_message发送消息,每个消息都有类型,对应到具体的回调函数

 

ring_init(&worker->current_list)

 

初始化维护当前display上要画的Drawable对象的环

 

image_surface_init(worker)

 

初始化Image surface函数指针

 

drawables_init

 

初始化1000个Drawable对象

 

cursor_items_init

 

初始化100个光标对象

 

red_init_streams

 

初始化50个流媒体缓冲区

 

worker->poll_fds[0].fd = worker->channel;    worker->poll_fds[0].events = POLLIN;   worker->watches[0].watch_func = handle_dev_input;

设置第一个网络事件监听dispatcher发送过来的时间,处理函数为 handle_dev_input

red_memslot_info_init

初始化内存槽相关参数

spice_timer_queue_create

创建定时器队列,之后在处理视频流的地方要用到

write_message

向Dispatcher发送 RED_WORKER_MESSAGE_READY消息,告知red_worker初始化完成

 

你可能感兴趣的:(spice,qemu-kvm)