在本节,我们主要通过数据结构设计、函数设计来定义如何实现自研的notifier机制。
在5.1节,我们对Linux内核的notifier框架做了拆解分析,并对内核使用场景进行了举例说明,在了解了其工作机制和使用场景后,我们可以在其他操作系统中实现一套自己的notifier框架。在动手之前,我们同样来整理一下思路:
1)我们需要设计一个结构体,供用户在注册节点时使用。
2)我们还需要提供注册函数和去注册函数。
当注册完成后,我们需要提供调用接口,来遍历注册的notifier节点的回调函数。
为了方便起见,我们使用系统提供的链表接口(假设系统中提供了类似于内核的带头双向循环链表)。在这里我们不严格参考内核的实现,只支持裸上下文的接口:在回调用户注册的回调函数时,上下文类型由用户自行设计,可以是原子上下文,也可以是任务上下文,相关设计实现代码段如下所示:
其中*data为要传递给notifier_call的参数,priority为该节点的优先级。
对外函数,供其他模块调用,用于注册自己的notifier节点。
入参*head为要挂接的目的节点;入参*node为操作的模块的节点。该函数无返回值。
相关设计实现代码段如下所示:
对外函数,为注册notifier的模块提供退出机制,从链表中删除其节点即可。
入参*node为操作的模块的节点。该函数无返回值。
相关设计实现代码段如下所示:
notifier模块内部函数,回调所有注册notifier的模块的回调函数。
入参*head表示要操作的目标通知链;入参action表示当前对应的操作,并传递给notifier回调函数。执行成功返回0,否则返回执行过程中任何一个执行失败的回调函数的错误码。
相关设计实现代码段如下所示:
到现在为止,基础的notifier框架就介绍完了,所有需要notifier提供底层实现的模块都可以基于这个进行封装,比如pm_notifier等。