spice之red worker工作流程浅析
2016-10-08 17:01
330 查看
redworker笔记
1)redworker由dispatcher(Red_dispatcher.c)以线程的形式启动
2)red_worker_main流程
SPICE_GNUC_NORETURN void *red_worker_main(void *arg)
{
RedWorker *worker = spice_malloc(sizeof(RedWorker));
spice_info("begin");
spice_assert(MAX_PIPE_SIZE > WIDE_CLIENT_ACK_WINDOW &&
MAX_PIPE_SIZE > NARROW_CLIENT_ACK_WINDOW); //ensure wakeup by ack message
#if defined(RED_WORKER_STAT) || defined(COMPRESS_STAT)
if (pthread_getcpuclockid(pthread_self(), &clock_id)) {
spice_error("pthread_getcpuclockid failed");
}
#endif
//初始化worker,设置回调,内存池初始化,cache初始化等
red_init(worker, (WorkerInitData *)arg);
//初始化解压器
red_init_quic(worker);
red_init_lz(worker);
red_init_jpeg(worker);
red_init_zlib(worker);
worker->event_timeout = INF_EVENT_WAIT;
//进入循环,POLL处理事件
for (;;) {
int i, num_events;
worker->event_timeout = MIN(red_get_streams_timout(worker), worker->event_timeout);
num_events = poll(worker->poll_fds, MAX_EVENT_SOURCES, worker->event_timeout);
red_handle_streams_timout(worker);
if (worker->display_channel) {
/* during migration, in the dest, the display channel can be initialized
while the global lz data not since migrate data msg hasn't been
received yet */
red_channel_apply_clients(&worker->display_channel->common.base,
red_display_cc_free_glz_drawables);
}
worker->event_timeout = INF_EVENT_WAIT;
if (num_events == -1) {
if (errno != EINTR) {
spice_error("poll failed, %s", strerror(errno));
}
}
for (i = 0; i < MAX_EVENT_SOURCES; i++) {
/* The watch may have been removed by the watch-func from
another fd (ie a disconnect through the dispatcher),
in this case watch_func is NULL. */
if (worker->poll_fds[i].revents && worker->watches[i].watch_func) {
int events = 0;
if (worker->poll_fds[i].revents & POLLIN) {
events |= SPICE_WATCH_EVENT_READ;
}
if (worker->poll_fds[i].revents & POLLOUT) {
events |= SPICE_WATCH_EVENT_WRITE;
}
//dispatcher 交互
worker->watches[i].watch_func(worker->poll_fds[i].fd, events,
worker->watches[i].watch_func_opaque);
}
}
/* Clear the poll_fd for any removed watches, see the comment in
watch_remove for why we don't do this there. */
for (i = 0; i < MAX_EVENT_SOURCES; i++) {
if (!worker->watches[i].watch_func) {
worker->poll_fds[i].fd = -1;
}
}
//QXL Device 交互
if (worker->running) {
int ring_is_empty;
red_process_cursor(worker, MAX_PIPE_SIZE, &ring_is_empty);
red_process_commands(worker, MAX_PIPE_SIZE, &ring_is_empty);
}
red_push(worker);
}
abort();
}
参考:spice_for_newbies.pdf
<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
阅读(889) | 评论(0) | 转发(1) |
0
上一篇:gtest
下一篇:Xshell连接Ubuntu
相关热门文章
[官版翻译ing]OpenStack云计算...
[官版翻译ing]OpenStack云计算...
hive的安装和配置
OpenStack安装记
Hadoop运行class类出现Excepti...
linux dhcp peizhi roc
关于Unix文件的软链接
求教这个命令什么意思,我是新...
sed -e "/grep/d" 是什么意思...
谁能够帮我解决LINUX 2.6 10...
给主人留下些什么吧!~~
评论热议
1)redworker由dispatcher(Red_dispatcher.c)以线程的形式启动
2)red_worker_main流程
SPICE_GNUC_NORETURN void *red_worker_main(void *arg)
{
RedWorker *worker = spice_malloc(sizeof(RedWorker));
spice_info("begin");
spice_assert(MAX_PIPE_SIZE > WIDE_CLIENT_ACK_WINDOW &&
MAX_PIPE_SIZE > NARROW_CLIENT_ACK_WINDOW); //ensure wakeup by ack message
#if defined(RED_WORKER_STAT) || defined(COMPRESS_STAT)
if (pthread_getcpuclockid(pthread_self(), &clock_id)) {
spice_error("pthread_getcpuclockid failed");
}
#endif
//初始化worker,设置回调,内存池初始化,cache初始化等
red_init(worker, (WorkerInitData *)arg);
//初始化解压器
red_init_quic(worker);
red_init_lz(worker);
red_init_jpeg(worker);
red_init_zlib(worker);
worker->event_timeout = INF_EVENT_WAIT;
//进入循环,POLL处理事件
for (;;) {
int i, num_events;
worker->event_timeout = MIN(red_get_streams_timout(worker), worker->event_timeout);
num_events = poll(worker->poll_fds, MAX_EVENT_SOURCES, worker->event_timeout);
red_handle_streams_timout(worker);
if (worker->display_channel) {
/* during migration, in the dest, the display channel can be initialized
while the global lz data not since migrate data msg hasn't been
received yet */
red_channel_apply_clients(&worker->display_channel->common.base,
red_display_cc_free_glz_drawables);
}
worker->event_timeout = INF_EVENT_WAIT;
if (num_events == -1) {
if (errno != EINTR) {
spice_error("poll failed, %s", strerror(errno));
}
}
for (i = 0; i < MAX_EVENT_SOURCES; i++) {
/* The watch may have been removed by the watch-func from
another fd (ie a disconnect through the dispatcher),
in this case watch_func is NULL. */
if (worker->poll_fds[i].revents && worker->watches[i].watch_func) {
int events = 0;
if (worker->poll_fds[i].revents & POLLIN) {
events |= SPICE_WATCH_EVENT_READ;
}
if (worker->poll_fds[i].revents & POLLOUT) {
events |= SPICE_WATCH_EVENT_WRITE;
}
//dispatcher 交互
worker->watches[i].watch_func(worker->poll_fds[i].fd, events,
worker->watches[i].watch_func_opaque);
}
}
/* Clear the poll_fd for any removed watches, see the comment in
watch_remove for why we don't do this there. */
for (i = 0; i < MAX_EVENT_SOURCES; i++) {
if (!worker->watches[i].watch_func) {
worker->poll_fds[i].fd = -1;
}
}
//QXL Device 交互
if (worker->running) {
int ring_is_empty;
red_process_cursor(worker, MAX_PIPE_SIZE, &ring_is_empty);
red_process_commands(worker, MAX_PIPE_SIZE, &ring_is_empty);
}
red_push(worker);
}
abort();
}
参考:spice_for_newbies.pdf
<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
阅读(889) | 评论(0) | 转发(1) |
0
上一篇:gtest
下一篇:Xshell连接Ubuntu
相关热门文章
[官版翻译ing]OpenStack云计算...
[官版翻译ing]OpenStack云计算...
hive的安装和配置
OpenStack安装记
Hadoop运行class类出现Excepti...
linux dhcp peizhi roc
关于Unix文件的软链接
求教这个命令什么意思,我是新...
sed -e "/grep/d" 是什么意思...
谁能够帮我解决LINUX 2.6 10...
给主人留下些什么吧!~~
评论热议
相关文章推荐
- spice server qxl red_worker_main()代码分析
- Android 4.4 Kitkat Phone工作流程浅析(九)__状态通知流程分析
- Android 4.4 Kitkat Phone工作流程浅析(四)__RILJ工作流程简析
- 浅析Java虚拟机的工作流程
- Android 4.4 Kitkat Phone工作流程浅析(一)__概要和学习计划
- Android 4.4 Kitkat Phone工作流程浅析(三)__MO(去电)流程分析
- Android 4.4 Kitkat Phone工作流程浅析(八)__Phone状态分析
- Android 4.4 Kitkat Phone工作流程浅析(九)__状态通知流程分析
- spice server qxl red_worker_main()代码分析
- Android 4.4 Kitkat Phone工作流程浅析(一)__概要和学习计划
- Android 4.4 Kitkat Phone工作流程浅析(六)__InCallActivity显示更新流程
- Android 4.4 Kitkat Phone工作流程浅析(二)__UI结构分析
- Android 4.4 Kitkat Phone工作流程浅析(八)__Phone状态分析
- [很好]浅析Java虚拟机的工作流程
- Android 4.4 Kitkat Phone工作流程浅析(十一)__PSensor工作流程浅析
- Android 4.4 Kitkat Phone工作流程浅析(五)__MT(来电)流程分析
- Struts2的工作流程浅析
- Android 4.4 Kitkat Phone工作流程浅析(三)__MO(去电)流程分析
- Spice代码分析(三)——red_worker: red_init
- Android 4.4 Kitkat Phone工作流程浅析(三)__MO(去电)流程分析