设为首页 加入收藏

TOP

浅析Android的RILD服务进程的消息循环
2014-11-24 11:55:09 来源: 作者: 【 】 浏览:0
Tags:浅析 Android RILD 服务 进程 消息 循环





消息循环(ril_event_loop()函数内)位于单独的线程中,用来处理三种消息,分别对应三个不同的队列,面对的是三种不同的需求:
1.定时列表(timer_list): 此队列中的消息主要用于处理一些延时的操作。比如:从飞信模式切换到通信模式(实际上就是打开通信模块)时,若SIM卡未准备好,那么需要延续一段时间再检查是否准备好,此时就要将消息扔至此队列。
2.侦听列表(watch_list): 此队列中的消息一是作为socket的服务端,用来侦听客户端的请求;另一个是作为本进程的其它线程(如:检查通信模块来电消息的线程)传递过来的消息。
3.挂起列表(pending_list): 之所以叫挂起,实际上指的是在处理上面两中类型的消息时,并不真正的处理消息体,而是将符合条件的消息丢到本队列中。由于消息附带处理函数,所以在处理本队列的消息时,直接触发即可。
消息循环所要做的事就是先等待某个时间间隔(定时消息要求的)或者是客户端(socket或通讯模块的消息)的请求,然后再按次序处理上面三个对列中的消息。


下面还是通过源代码来分析消息循环的处理过程。



ril_event指代的是消息,它的数据结构如下:




初始化过程还是要从rild的main入口开始分析起,位于文件hardware/ril/rild/rild.c。简单期间,只介绍本文相关的部分。main()函数会调用函数RIL_register(),然后会调用RIL_startEventLoop()。RIL_startEventLoop()中会创建线程eventLoop,这个实际上就是rild的消息循环所在的线程。




ril_event_loop()中,每次循环都主要做三件事:
1.初始化。主要是获取要等待的描述符,以及获取超时信息,以便能够及时处理定时消息。
2.等待。等待socket客户端有新的消息,或一定的时间间隔,之后处理定时消息。
3.依次处理三种类型的消息。
下面分别叙述之。先是获取要等待的描述符,这里为什么要这么做呢?我的理解是在添加新的消息时,有可能会修改全局的描述符列表。也就是说,全局的描述符列表有可能在本次循环的处理过程中发生变化。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Linux设备驱动工程师之路——简单.. 下一篇Android 联系人查询结果的排序问题

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·C++ Lambda表达式保 (2025-12-26 05:49:45)
·C++ Lambda表达式的 (2025-12-26 05:49:42)
·深入浅出 C++ Lambda (2025-12-26 05:49:40)
·C语言指针从入门到基 (2025-12-26 05:21:36)
·【C语言指针初阶】C (2025-12-26 05:21:33)