Android RIL源码研究笔记 の ril_event
Android RIL源码研究笔记 の ril_event
Android源码目录hardware/ril/libril目录中总共包含5个C/CPP文件,它们分别是ril_commands.h、ril_unsol_commands.h、ril_event.h、ril_event.cpp和ril.cpp。这篇文章主要分析ril_event的相关代码。ril_event主要处理电话模块涉及的端口、modem等产生的事件,并将多个事件按时间顺序进行组织,并保存在事件队别中,主要使用了三个队列,分别是:watch_table[],timer_list和pending_list。代码是以C语言方式实现的,先来看头文件ril_event.h:
- // 每次监视的最大的文件描述符句柄数,可以根据需要自行修改
- #define MAX_FD_EVENTS 8
- // ril_event的回调函数
- typedef void (*ril_event_cb)(int fd, short events, void *userdata);
- struct ril_event {
- // 用于将ril_event串成双向链表的前向指针和后向指针
- struct ril_event *next;
- struct ril_event *prev;
- //ril事件相关的文件描述符句柄(可以是文件、管道、Socket等)
- int fd;
- //这个事件在监控列表中的索引
- int index;
- //当一个事件处理完后(即从watch_table移到pending_list中等待处理),
- //persist参数决定这个事件是否一直存在于监控列表watch_table[]中
- bool persist;
- //事件的超时时间
- struct timeval timeout;
- //回调函数及其传入的参数
- ril_event_cb func;
- void *param;
- };
- //以下是ril事件相关的一些操作函数
- // 初始化内部数据结构
- void ril_event_init();
- // 初始化一个ril事件
- void ril_event_set(struct ril_event * ev, int fd, bool persist, ril_event_cb func, void * param);
- // 将事件添加到监控列表watch_table[]中
- void ril_event_add(struct ril_event * ev);
- // 增加一个timer事件到timer_list链表中
- void ril_timer_add(struct ril_event * ev, struct timeval * tv);
- // 将指定的事件从监控列表watch_table[]中移除
- void ril_event_del(struct ril_event * ev);
- // 事件循环
- void ril_event_loop();
|
评论暂时关闭