没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
试读
15页
Rild. 一直在后台运行,即使被kill掉,或者出错死掉也能重新启动,在init.rc中定义 service ril-daemon /system/bin/rild socket rild stream 660 root radio socket rild-debug stream 660 radio system user root group radio cache inet misc audio qcom_oncrpc diag
资源推荐
资源详情
资源评论
RIL&QCRIL&QMI
Android RIL Architecture
rild 线程
Rild. 一直在后台运行,即使被 kill 掉,或者出错死掉也能重新启动,在 init.rc 中定义
service ril-daemon /system/bin/rild
socket rild stream 660 root radio
socket rild-debug stream 660 radio system
user root
group radio cache inet misc audio qcom_oncrpc diag
Rild 线程的 main 函数在 rild.c 里面。
主要的 3 个步骤:
main()
{
……
RIL_startEventLoop();
……
rilInit = (const RIL_RadioFunctions*(*)(const struct RIL_Env*, int, char**))dlsym(dlHandle,
"RIL_Init");/*RIL_Init 函数在 Qcril.c 中*/
……
funcs = rilInit(&s_rilEnv, argc, rilArgv);
……
RIL_register(funcs);/*Ril.cpp*/
}
步骤一:
RIL_startEventLoop()函数会创建一个“main”线程,
int result = pthread_create(&s_tid_dispatch, &attr, eventLoop, NULL);/*后续会把线程名改为
“main”*/
入口函数为 eventLoop(),而 eventLoop 中,会调 ril_event.cpp 中的 ril_event_loop()函数,建
立起消息(event)队列机制。详见 main 线程说明。
步骤二:
调用 Qcril.c 中的 RIL_Init()函数,首先会设置 rild 线程名
qmi_ril_set_thread_name( pthread_self() , QMI_RIL_QMI_RILD_THREAD_NAME);
RIL_Init 函数里关键步骤:
1. 调用 qcril_event_init 函数创建一个“event”线程
ret = pthread_create(&qcril_event.tid, &attr, qcril_event_main, NULL);
/*设置线程名为 event*/
qmi_ril_set_thread_name(qcril_event.tid, QMI_RIL_EVENT_THREAD_NAME);
创建“event”线程后,“rild”线程会阻塞并等待“event”线程初始化完毕后再继续执行
如下代码:
while (qcril_event.started == 0)
{
pthread_cond_wait(&qcril_event_startupCond, &qcril_event.startup_mutex);
}
“event”线程入口函数为 qcril_event_main,“ event”线程初始化完成后会通知“rild”线程
如下代码:
pthread_cond_broadcast(&qcril_event_startupCond);
通知完后“event”线程并不继续运行,而是阻塞并等待“rild”线程的通知后才继续运行
如下代码:
while (qcril_event.started < 2)
{
QCRIL_LOG_VERBOSE("Event thread waiting for started == 2 (%d)", qcril_event.started );
pthread_cond_wait(&qcril_event_startupCond, &qcril_event.startup_mutex);
}
再返回“rild”线程,收到“event”线程初始化完成通知后会调用 qcril_event_start 函数通知
“event”线程继续执行,进入消息循环处理函数 qcril_process_event-〉qcril_dispatch_event。
即“rild”与“event”线程存在一个互锁的过程。
qcril_dispatch_event 根据 Qcril_event_table 进行分发
2. RIL_Init 除了创建“event”线程,还要保存上下文用于回复响应
rilInit(s_rilEnv, argc, s_argv);/* "s_rilEnv 是定义时就初始化了的函数,给 qcril 用来回复上层 ril
的
a 、 qcril_response_api[ instance_id ] = (struct RIL_Env*) env; 其 中 env 就 是 s_rilEnv , 而
qcril_response_api 是用来发回复的接口数组
b、return &qcril_request_api[ instance_id ];这个是返回的数组,赋值给了 funcs_inst,包含用
剩余14页未读,继续阅读
资源评论
- tomwang1232018-06-25家里下载的,还没有看
我有特殊的取名技巧
- 粉丝: 5
- 资源: 7
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功