关于RIL层一条命令的轮回转世

1、RIL_commands.h中定义了许多命令ID,处理函数和响应函数的三列表项

{RIL_REQUEST_GET_SIM_STATUS, dispatchVoid, responseSimStatus},

首先RIL_commands.h被用来初始化RIL.cpp中的一个全局变量s_commands,其类型如下

typedef struct {
    int requestNumber;
    void (*dispatchFunction) (Parcel &p, struct RequestInfo *pRI);
    int(*responseFunction) (Parcel &p, void *response, size_t responselen);
} CommandInfo;

那么从监视到socket文件发生变化开始

ril_event_loop()->firePending()->遍历一个叫pendingList的链表,执行其中的ev的callback函数,对于

s_listen_event的回调函数为listenCallback(这个回调函数指向的赋值再startListen函数中)

listenCallback ->

processCommandsCallback->

processCommandBuffer->根据requestNumber匹配对应的处理函数

dispatchVoid ->CALL_ONREQUEST

看宏定义#define CALL_ONREQUEST(a, b, c, d, e) s_callbacks.onRequest((a), (b), (c), (d), (e))

而s_callbacks 再rild初始化中调用RIL_register时被赋值为reference-ril库中传递过来的用来回调结构指针func,所以至此一条消息从接到RILJ的请求到调用第三方库提供的发送接口完成。

我们知道libRIL与厂商第三方库reference-ril的数据交互是通过动态引入库实现的,两者间是基于函数调用进行通信的,那么基于异步消息的方式且出于维护第三方的权益的方式考虑,两者之间的必然会有许多的函数回调方式。其中两者的回调接口分别为funcs和static struct RIL_Env s_rilEnv = {
    RIL_onRequestComplete,
    RIL_onUnsolicitedResponse,
    RIL_requestTimedCallback
};,两者的类型依次为typedef struct {
    int version;        /* set to RIL_VERSION */
    RIL_RequestFunc onRequest;
    RIL_RadioStateRequest onStateRequest;
    RIL_Supports supports;
    RIL_Cancel onCancel;
    RIL_GetVersion getVersion;
} RIL_RadioFunctions; 和RIL_ENV

转载于:https://my.oschina.net/u/2829875/blog/818766

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值