购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

5.2 实现自己的notifier框架

在本节,我们主要通过数据结构设计、函数设计来定义如何实现自研的notifier机制。

5.2.1 动手前的思考

在5.1节,我们对Linux内核的notifier框架做了拆解分析,并对内核使用场景进行了举例说明,在了解了其工作机制和使用场景后,我们可以在其他操作系统中实现一套自己的notifier框架。在动手之前,我们同样来整理一下思路:

1)我们需要设计一个结构体,供用户在注册节点时使用。

2)我们还需要提供注册函数和去注册函数。

当注册完成后,我们需要提供调用接口,来遍历注册的notifier节点的回调函数。

5.2.2 设计与实现

1.结构体设计

为了方便起见,我们使用系统提供的链表接口(假设系统中提供了类似于内核的带头双向循环链表)。在这里我们不严格参考内核的实现,只支持裸上下文的接口:在回调用户注册的回调函数时,上下文类型由用户自行设计,可以是原子上下文,也可以是任务上下文,相关设计实现代码段如下所示:

其中*data为要传递给notifier_call的参数,priority为该节点的优先级。

2.主要函数设计

(1)注册函数:notifier_register

对外函数,供其他模块调用,用于注册自己的notifier节点。

入参*head为要挂接的目的节点;入参*node为操作的模块的节点。该函数无返回值。

相关设计实现代码段如下所示:

(2)去注册函数:notifier_unregister

对外函数,为注册notifier的模块提供退出机制,从链表中删除其节点即可。

入参*node为操作的模块的节点。该函数无返回值。

相关设计实现代码段如下所示:

(3)遍历链表回调函数:notifier_call

notifier模块内部函数,回调所有注册notifier的模块的回调函数。

入参*head表示要操作的目标通知链;入参action表示当前对应的操作,并传递给notifier回调函数。执行成功返回0,否则返回执行过程中任何一个执行失败的回调函数的错误码。

相关设计实现代码段如下所示:

到现在为止,基础的notifier框架就介绍完了,所有需要notifier提供底层实现的模块都可以基于这个进行封装,比如pm_notifier等。 s3nWxoJadMLvwke0DOokgxRqIemlEhCGcuyl+KxtVS0HgdQ/ZWQQgbI7AjBLwrG0

点击中间区域
呼出菜单
上一章
目录
下一章
×