现在暂时记住TcpConnection是TcpServer中Acceptor关注的监听套接字上accept新连接后被初始化的一个对象,接下来分析下EventLoop
这个东西才是真正驱动库的核心,是别的类(EpollPoller Acceptor )帮助他完成了库的功能,看看内部是怎么实现的。
EventLoop:
这个类中最重要的成员就是poller_,这个成员调用epoll_wait监听这个EventLoop所关注的所有套接字,poller_在这里的作用就是:当其返回时,activeChannel_内是所有有事件的Channel,然后就调用Channel中的handleEvent()即可。
而updateChannel和removeChannel就是和向EventList(这个成员在poller_中)添加删除某一个Channel(虽说Channel不拥有socketfd,但是Channel和某个特定的socketfd进行绑定)。
内部还有一个wakeupFd_,这是为了异步唤醒而存在的socketfd,线程间同行可以使用eventfd产生的socketfd,wakeupFd_就是这样的套接字(想下muduo的默认模型就明白这个套接字存在的意义了)。与这个套接字相关联的Channel就是wakeupChannel_。
其他也有和Timer相关的函数和成员变量,这里暂时不分析。
还有几个重要的标志位:
looping_ 标志是否继续loop,进入loop()函数就将此值赋值为true,退出loop循环为false
quit_,标志是否退出loop循环
eventHandling_
在处理activeChannel_链表中的事件的过程中,此值为true,activeChannel_链表中的事件执行结束后,此值为false。存在的意义是在removeChannel函数中,删除某一个Channel,需要判断此值,如果为true,那么当前需要删除的事件不要在activeChannel_链表中并且当前正在处理的事件currentActiveChannel_不能是想要删除的Channel。
首先如果保证需要删除的Channel不在activeChannel_中,而currentActiveChannle_ == channel 是为了保证channel不为NULL,其实第一条就已经保证了Channel不用误删,在正在处理当前activeChannels_的前后一个阶段currentActiveChannel_都为NULL
callingPendingFunctors_
timerQueue_
wakeupFd_
wakeupChannel_
currentActiveChannel_
在loop()函数中,调用poller_的poll函数,可以获得所有存在事件组成的一个链表,链表中的元素为Channel,链表为activeChannel。这个函数就是通过poller_得到一个激活事件的链表,然后再回调各个Channel中的事件处理回调
isInLoopThread():
判断当前线程是否为此EventLoop所在的线程。
quit()
瑞出循环函数(这个循环就是loop中的while循环)如果这个EventLoop不在当前线程,就用wakeup异步唤醒
runInLoop()
如果EventLoop属于当前线程,直接调用回调
如果不在一个线程,添加到队列中(pendingFunctors_),然后唤醒调用的线程!
在runInLoop函数中,添加回调想这个EventLoop中,如果当前线程属于EventLoop所属的线程,那么直接执行注册的回调,如果不在同一个线程,那么存放到队列中,然后唤醒线程,唤醒线程的意思就是让poll返回,只要poll将返回,就可以按序执行向量中注册的回调(执行的函数是doPendingFunctors(),如果在doPendingFunctors函数正在执行的过程中又通过queueInLoop注册了新的函数,那么在此wakup)
举例说明:
比如在threadA中创建了一个EventLoop event_threada,虽说在这个线程创建且在这个线程中使用,但是在线程threadB中使用,且注册了一个回调,那么让threadA去处理
(未完待续)
相关文章
- 【Java源码分析】集合框架-Collections工具类-Arrays工具类
- 性能工具之JMeter5.0核心类StandardJMeterEngine源码分析
- Django框架之drf:5、反序列化器校验部分源码分析、断言、drf之请求与响应、视图组件介绍及两个视图基类、代码部分实战
- ApiView/Request类源码分析/序列化器
- 【Django drf】 序列化类常用字段类和字段参数 定制序列化字段的两种方式 关系表外键字段的反序列化保存 序列化类继承ModelSerializer 反序列化数据校验源码分析
- Jetty 9 源码分析 Connector及Server类(一)
- Java基础之 Integer 类源码分析
- 类路径分析Java的类加载器与ClassLoader(二):classpath与查找类字节码的顺序,分析ExtClassLoader与AppClassLoader的源码
- 分析Java的类加载器与ClassLoader(二):classpath与查找类字节码的顺序,分析ExtClassLoader与AppClassLoader的源码
- Java中集合框架,Collection接口、Set接口、List接口、Map接口,已经常用的它们的实现类,简单的JDK源码分析底层实现