RIL代码分析
代码位于:android/hardware/ril
1 rild.c中的main()函数提供了rild的入口
首先,通过main函数的传参,cmdline,内核选项等方式获取rild.libpath和rild.libargs。
我们这里主要是:/system/lib/libreference-ril.so。
2 RIL_startEventLoop():建立消息队列的机制,开始事件的监听
函数RIL_startEventLoop()开启了一标识符为s_tid_dispatch的线程,线程的入口函数为eventLoop()。
ril_event_init()进行消息队列的初始化,主要是初始化读文件描述符集readfds,time_list,pending_list和watch_table;后面三个都是ril_event的结构体变量
由定义可以看出它是一个双向链表。(重要的数据结构,后面会反复使用)
通过pipe()创建一个无名管道,对这个管道的读写描述符分别为:
|
创建一个s_wakeupfd_event的ril_event,消息的fd为s_fdWakeupRead,消息的处理函数为processWakeupCallback();这个处理函数主要是读取管道内的消息。
将s_wakeupfd_event加入消息队列并触发消息队列:
ril_event_add(ev):将ev加入watch_table[i];将ev->fd加入读文件描述符集readFds。
triggerEvLoop():如果s_tid_dispatch 线程结束,通过s_fdWakeupWrite写一个变