歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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();  
Copyright © Linux教程網 All Rights Reserved