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();