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:

  1. // 每次监视的最大的文件描述符句柄数,可以根据需要自行修改   
  2. #define MAX_FD_EVENTS 8   
  3.   
  4. // ril_event的回调函数   
  5. typedef void (*ril_event_cb)(int fd, short events, void *userdata);  
  6.   
  7. struct ril_event {  
  8.     // 用于将ril_event串成双向链表的前向指针和后向指针   
  9.     struct ril_event *next;  
  10.     struct ril_event *prev;  
  11.       
  12.     //ril事件相关的文件描述符句柄(可以是文件、管道、Socket等)   
  13.     int fd;  
  14.       
  15.     //这个事件在监控列表中的索引   
  16.     int index;  
  17.       
  18.     //当一个事件处理完后(即从watch_table移到pending_list中等待处理),   
  19.     //persist参数决定这个事件是否一直存在于监控列表watch_table[]中   
  20.     bool persist;  
  21.       
  22.     //事件的超时时间   
  23.     struct timeval timeout;  
  24.       
  25.     //回调函数及其传入的参数   
  26.     ril_event_cb func;  
  27.     void *param;  
  28. };  
  29.   
  30. //以下是ril事件相关的一些操作函数   
  31. // 初始化内部数据结构   
  32. void ril_event_init();  
  33.   
  34. // 初始化一个ril事件   
  35. void ril_event_set(struct ril_event * ev, int fd, bool persist, ril_event_cb func, void * param);  
  36.   
  37. // 将事件添加到监控列表watch_table[]中   
  38. void ril_event_add(struct ril_event * ev);  
  39.   
  40. // 增加一个timer事件到timer_list链表中   
  41. void ril_timer_add(struct ril_event * ev, struct timeval * tv);  
  42.   
  43. // 将指定的事件从监控列表watch_table[]中移除   
  44. void ril_event_del(struct ril_event * ev);  
  45.   
  46. // 事件循环   
  47. void ril_event_loop();  
  • 1
  • 2
  • 下一页

相关内容