二、EventLoop机制
LibRIL负责接收来自RILJ的数据,并传递给ReferenceRIL。实现这一功能的主要机制就是EventLoop机制。
分析LibRIL主要就是分析EventLoop。
2.1 EventLoop相关预备知识
2.1.1 EventLoop中的Event
在ril_event.h头文件中可以看到ril_event的结构体定义
//定义Event回调函数指针
typedef void (*ril_event_cb)(int fd, short events, void *userdata);
struct ril_event {
struct ril_event *next;//Event为链式结构
struct ril_event *prev;
int fd;//文件句柄,一个重要的句柄是RILD与RILC的Socket句柄
int index;//Event在对应watch_table中的序列号
bool persist;//是否在watch_table中持久化
struct timeval timeout;
ril_event_cb func;//event触发的回调函数
void *param;//对应event回调函数的参数
};
2.1.2 EventLoop中对Event的处理函数
在ril_event.h头文件中定义了一些关键方法
//@ril_event.h
// Initialize internal data structs
//初始化EventLoop数据结构
void ril_event_init();
// Initialize an event
//初始化一个Event
void ril_event_set(struct ril_event * ev, int fd, bool persist, ril_event_cb func, void * param);
// Add event to watch list
//添加一个Event到watch_table
void ril_event_add(struct ril_event * ev);
// Add timer event
//添加一个event到timer表,注意这里会将ev放到一个time_list中时间大与ev的节点前面,这样可以维护time_list链表节点的timeval属性是递增的
void ril_timer_add(struct ril_event * ev, struct timeval * tv);
// Remove event from watch list
//移除一个Event
void ril_event_del(struct ril_event * ev);
// Event loop
//开启EventLoop机制
void ril_event_loop();
void traverse_timer_list();
还有一些函数定义在ril_event.cpp中,并声明为static,只供文件内部调用:
//Event的初始化,其实就是对3个主要链表的初始化
static void init_list(struct ril_event * list)
//添加Event到参数所指定的list
static void addToList(struct ril_event * ev, struct ril_event * list)
//从链表删除Event,直接在其上下链节点中断开,无