歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android RIL源碼研究筆記 の ril_event

Android RIL源碼研究筆記 の ril_event

日期:2017/3/1 10:50:26   编辑:Linux編程
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. // ril_event的回調函數
  4. typedef void (*ril_event_cb)(int fd, short events, void *userdata);
  5. struct ril_event {
  6. // 用於將ril_event串成雙向鏈表的前向指針和後向指針
  7. struct ril_event *next;
  8. struct ril_event *prev;
  9. //ril事件相關的文件描述符句柄(可以是文件、管道、Socket等)
  10. int fd;
  11. //這個事件在監控列表中的索引
  12. int index;
  13. //當一個事件處理完後(即從watch_table移到pending_list中等待處理),
  14. //persist參數決定這個事件是否一直存在於監控列表watch_table[]中
  15. bool persist;
  16. //事件的超時時間
  17. struct timeval timeout;
  18. //回調函數及其傳入的參數
  19. ril_event_cb func;
  20. void *param;
  21. };
  22. //以下是ril事件相關的一些操作函數
  23. // 初始化內部數據結構
  24. void ril_event_init();
  25. // 初始化一個ril事件
  26. void ril_event_set(struct ril_event * ev, int fd, bool persist, ril_event_cb func, void * param);
  27. // 將事件添加到監控列表watch_table[]中
  28. void ril_event_add(struct ril_event * ev);
  29. // 增加一個timer事件到timer_list鏈表中
  30. void ril_timer_add(struct ril_event * ev, struct timeval * tv);
  31. // 將指定的事件從監控列表watch_table[]中移除
  32. void ril_event_del(struct ril_event * ev);
  33. // 事件循環
  34. void ril_event_loop();
Copyright © Linux教程網 All Rights Reserved