关闭

spice-client 源码解析之event_sources_p.cpp

106人阅读 评论(0) 收藏 举报
分类:

这个函数是用来对event进行处理的函数,通过一系列的函数获取event的flag以及文件描述符,并对event执行创建和删除工作。

首先,补充这部分涉及到的I/O知识:

1.I/O阻塞模式
通常IO操作都是阻塞I/O的,也就是说当你调用read时,如果没有数据收到,那么线程或者进程就会被挂起,直到收到数据,再进行进行读写操作。应用的函数进行调用,但是内核一直没有返回,就一直等着。应用的函数长时间处于等待结果的状态,我们就称为阻塞I/O。

2.I/O非阻塞模式
调用一个I/O操作的时候,会等待数据,如果没有数据过来,就即刻返回一个error。这样就不会有线程的阻塞,但是需要一直采用轮询的方式查询操作。这个轮询过程是很浪费时间的。

3.I/O的多路复用
多路复用是指使用一个线程来检查多个文件描述符(Socket)的就绪状态,spice中使用了select()函数,一次性地传入多个文件描述符fd,如果有一个文件描述符就绪,则返回,否则阻塞直到超时一但得到就绪状态后就进行真正的操作。

然后就是代码部分啦

void EventSources_p::add_event(int fd, EventSource* source)
void EventSources_p::remove_event(EventSource* source)
bool EventSources::wait_events(int timeout_msec)

通过使用以上三个函数进行event的添加,删除以及轮询操作;

1.wait_events(int timeout_msec)
1.1 设置等待时间:timeout_msec;
1.2 调用系统函数FD_ZERO(&rfds):清空文件描述符,这里每次使用完内存如果没有释放的话,再次使用的数据就有可能出错,所以旧的数据进行清空;
1.3 调用ready = ::select(maxfd+1, &rfds, NULL, NULL, tvp):spice使用这个函数进行事件的轮询;
轮询结果:
(1).wait error select failed :并没有数据可以处理
(2).if (FD_ISSET(_fds[i], &rfds)) {
_events[i]->action();
return false;
}//该事件可以处理,需要判断是否已经在执行了

如果对象已经在执行了:return false;
如果对象未被执行:使用如下代码添加对象到执行队列,并创建pipe;
调用set_non_blocking(_event_fd)使能非阻塞I/O;

void EventSources::add_trigger(Trigger& trigger)
EventSources::Trigger::Trigger()

当对象结束执行,调用:

void EventSources::remove_trigger(Trigger& trigger)

2.add_event(int fd, EventSource* source)
重新定义事件队列大小,并将event装入_event[size],_fds[size]中装入对应的文件描述符;

3.remove_event(EventSource* source)
清空event和fds;

当然,2和3过程还涉及到了,socket和fd的添加,event的重置等;

void EventSources::add_socket(Socket& socket)
{
    add_event(socket.get_socket(), &socket);
    set_non_blocking(socket.get_socket());
}

void EventSources::remove_socket(Socket& socket)
{
    remove_event(&socket);
    int fd = socket.get_socket();
    set_blocking(fd);
}

void EventSources::add_file(File& file)
{
    add_event(file.get_fd(), &file);
}

void EventSources::remove_file(File& file)
{
    remove_event(&file);
}

void EventSources::add_handle(Handle& file)
{
}

void EventSources::remove_handle(Handle& file)
{
}

补充:
整个过程的select()函数是有弊端的:
【1】每次调用select()都需要把fd(文件描述符)从用户态拷贝到内核态,开销比较大
【2】每次都需要在内核遍历传入的fd(文件描述符)
【3】select支持文件数量比较小,默认是1024
参考链接:
https://www.cnblogs.com/skiler/p/6852493.html

0
0
查看评论

spice-client源码解析之process_loop.cpp

spice 维护了一个Events Queue Loop,用来处理事件; 首先要注意的是这个函数:Timer::Timer() TimersQueue::TimersQueue(AbstractProcessLoop& owner) TimersQueue::clear_queue() T...
  • ggg_xxx
  • ggg_xxx
  • 2017-11-16 10:45
  • 69

spice-client源码解析之application.cpp

application.c是作为客户端和服务端建立连接的开始,并且函数里包括了对连接类型的设置,对智能卡的支持,channel 创建就是从这里开始的;1.配置信息Application::Application() : ProcessLoop (this) , _client (*t...
  • ggg_xxx
  • ggg_xxx
  • 2017-11-16 19:25
  • 71

spice-client 源码解析之red_peer.c

开始读spice 源码,代码基础不好,从最简单的做起吧。都是个人理解,如果有偏差,欢迎指正.. spice的每一个channel都是客户端到服务端的一个连接,每个连接都对应一个特定的socket套接字,在建立连接的时候,是通过red_peer.cpp程序来执行的。当一个连接建立的时候,有些线程是在q...
  • ggg_xxx
  • ggg_xxx
  • 2017-11-14 18:22
  • 135

jeeCmsV7-src 源码解析之五(Spring + FreeMarker的集成)

auto_detect 5 UTF-8 UTF-8 zh_CN true,false yyyy-MM-dd HH:mm:ss yyyy-MM-dd HH:mm:ss 0.###### true t
  • nipanlong001
  • nipanlong001
  • 2016-08-25 16:30
  • 355

Hystrix 源码解析 —— 命令执行(二)之执行隔离策略

<p>摘要: 原创出处 <a href="http://www.iocoder.cn/Hystrix/command-execute-second-isolation-strategy/">http://www.iocoder.cn/Hystrix/com...
  • cyq12345_
  • cyq12345_
  • 2017-12-12 13:53
  • 110

Servlet源码解析:Session、Request以及Response

首先我们来看看ServletRequest的源码: public interface ServletRequest { //获取request的属性(注意不是请求参数) public Object getAttribute(String name); //获取reque...
  • flashflight
  • flashflight
  • 2015-04-20 02:42
  • 2212

OpenLayers 项目完整分析——(二)源代码总体结构分析

 (二)源代码总体结构分析  通过前面的项目介绍,我们大概已经知道Openlayers是什么,能够做什么,有什么意义。接下来我们分析它怎么样,以及怎样实现的等问题。  这个图是从它的文档上截取的,旨在从感官上认识一下OpenLayers的类。下面分别介绍(文档中的类是按字母顺序排列的,也按...
  • king2232
  • king2232
  • 2008-11-19 12:59
  • 1245

android音乐播放器例子及其源码分析

android音乐播放器例子及其源码分析   这个例子是播放音乐的一个小例子也比较简单,大家需要去下载2个.mp3结尾的歌曲,然后放到SD卡里边 进行测试,就可以看到效果了。 运行效果如下 效果图:     Java代码:...
  • linux_loajie
  • linux_loajie
  • 2012-06-13 11:06
  • 6942

Hibernate源码分析GOOD

hibernate源码分析 -- 持久化原理
  • Baple
  • Baple
  • 2014-09-12 10:14
  • 5855

UGUI源码学习之初涉Text(二)

UGUI源码学习之初涉Text(二)先上截图关于Text并没有多少东西值得特别注意的,因为基本没有遇到坑嘛。 public class Text : MaskableGraphic, ILayoutElement 同是MaskableGraphic的子类,只有Image实现了ICanvasRa...
  • a237653639
  • a237653639
  • 2016-03-04 17:53
  • 501
    个人资料
    • 访问:6598次
    • 积分:249
    • 等级:
    • 排名:千里之外
    • 原创:18篇
    • 转载:3篇
    • 译文:0篇
    • 评论:3条
    最新评论