RILD - 第二章 - EventLoop机制的建立

本文详细介绍了Android RIL中的EventLoop机制,包括EventLoop的相关预备知识,如Event结构和处理函数。接着阐述了EventLoop的执行流程,创建线程、开启EventLoop以及Event响应的过程。重点讨论了watch_table、timer_list和pending_list三张链表的作用。此外,还介绍了select函数和struct timeval结构在EventLoop中的应用。通过对这些概念的理解,可以更好地掌握RIL如何处理来自RILJ的事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二、EventLoop机制

LibRIL负责接收来自RILJ的数据,并传递给ReferenceRIL。实现这一功能的主要机制就是EventLoop机制。
分析LibRIL主要就是分析EventLoop。

2.1 EventLoop相关预备知识

2.1.1 EventLoop中的Event

在ril_event.h头文件中可以看到ril_event的结构体定义

//定义Event回调函数指针
typedef void (*ril_event_cb)(int fd, short events, void *userdata);

struct ril_event {
    struct ril_event *next;//Event为链式结构
    struct ril_event *prev;
    int fd;//文件句柄,一个重要的句柄是RILD与RILC的Socket句柄
    int index;//Event在对应watch_table中的序列号
    bool persist;//是否在watch_table中持久化
    struct timeval timeout;
    ril_event_cb func;//event触发的回调函数
    void *param;//对应event回调函数的参数
};
2.1.2 EventLoop中对Event的处理函数

在ril_event.h头文件中定义了一些关键方法

//@ril_event.h
// Initialize internal data structs
//初始化EventLoop数据结构
void ril_event_init();

// Initialize an event
//初始化一个Event
void ril_event_set(struct ril_event * ev, int fd, bool persist, ril_event_cb func, void * param);

// Add event to watch list
//添加一个Event到watch_table
void ril_event_add(struct ril_event * ev);

// Add timer event
//添加一个event到timer表,注意这里会将ev放到一个time_list中时间大与ev的节点前面,这样可以维护time_list链表节点的timeval属性是递增的
void ril_timer_add(struct ril_event * ev, struct timeval * tv);

// Remove event from watch list
//移除一个Event
void ril_event_del(struct ril_event * ev);

// Event loop
//开启EventLoop机制
void ril_event_loop();
void traverse_timer_list();

还有一些函数定义在ril_event.cpp中,并声明为static,只供文件内部调用:

//Event的初始化,其实就是对3个主要链表的初始化  
static void init_list(struct ril_event * list)  
//添加Event到参数所指定的list
static void addToList(struct ril_event * ev, 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值