2.2 解除注册LOS_UnRegExcHook

我们再看看解除注册钩子函数的LOS_UnRegExcHook函数的源码,⑴处先判断传入参数的合法性。我们已经知道,同一个类型的异常钩子函数节点使用单向链表维护,我们需要执行
⑵处的循环进行遍历。遍历时,判断是否遍历到了要解除注册的函数,如果遍历到了,⑶成立,执行后续的代码。如果⑷成立,说明遍历到的节点不是第一个,把之前的节点执行当前要解除注册的节点的下一个节点,这样把要解除注册的节点从链表中进行删除。否则说明遍历到的节点为第一个,则执行⑸,把遍历到的下一个节点作为第一个节点,这样把要解除注册的节点从链表中进行删除。⑹处置空解除注册的节点,把该节点释放后作为空闲节点插入到钩子函数空闲节点链表g_excHeads[EXC_TYPE_END]的第一个位置上。

UINT32 LOS_UnRegExcHook(EXC_TYPE excType, ExcHookFn excHookFn)
{
    UINT32 intSave;
    struct Node *node = NULL;
    struct Node *preNode = NULL;
⑴  if (excType >= EXC_TYPE_END || excHookFn == NULL) {
        return LOS_ERRNO_SYS_PTR_NULL;
    }

    intSave = LOS_IntLock();
⑵  for (node = g_excHeads[excType]; node != NULL; node = node->next) {
⑶      if (node->excHookFn == excHookFn) {
⑷          if (preNode) {
                preNode->next = node->next;
            } else {
⑸              g_excHeads[excType] = node->next;
            }
⑹          node->excHookFn = NULL;
            node->next = g_excHeads[EXC_TYPE_END];
            g_excHeads[EXC_TYPE_END] = node;
        }
        preNode = node;
    }
    LOS_IntRestore(intSave);
    return LOS_OK;
}
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
class="hide-preCode-box">

3、异常钩子函数的执行

从上文中,我们了解到初始化钩子函数空闲链表后,通过语句OsExcHookRegister(DoExcHook)注册了异常钩子函数。现在我们就来分析下该函数的源码。DoExcHook函数会调用DoExcHookInRegOrder函数递归运行钩子函数链表上的所有节点维护的钩子函数。⑴处的代码调用函数DoExcHookInRegOrder,除了传入异常类型,还传入该异常类型对应的钩子函数节点链表的第一个节点。⑵处如果链表节点不为空,则递归调用该节点的下一个节点。⑶处执行异常钩子函数。因此,可以看得出,注册早的钩子函数在链表的尾部最先执行,注册晚的函数在链表的头部,最后执行。

STATIC VOID DoExcHookInRegOrder(EXC_TYPE excType, struct Node *node)
{
    if (node != NULL) {
⑵      DoExcHookInRegOrder(excType, node->next);
⑶      node->excHookFn(excType);
    }
}

STATIC VOID DoExcHook(EXC_TYPE excType)
{
    UINT32 intSave;
    if (excType >= EXC_TYPE_END) {
        return;
    }
    intSave = LOS_IntLock();
⑴  DoExcHookInRegOrder(excType, g_excHeads[excType]);
    LOS_IntRestore(intSave);
}

 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}"> class="hide-preCode-box">

小结

本文介绍了异常钩子模块的对外注册函数LOS_RegExcHook和解除注册函数LOS_UnRegExcHook,对内部维护的钩子函数节点链表有了更深的理解。

如果大家想更加深入的学习 OpenHarmony 开发的内容,不妨可以参考以下相关学习文档进行学习,助你快速提升自己:

OpenHarmony 开发环境搭建:https://qr18.cn/CgxrRy

《OpenHarmony源码解析》:https://qr18.cn/CgxrRy

系统架构分析:https://qr18.cn/CgxrRy

OpenHarmony 设备开发学习手册:https://qr18.cn/CgxrRy

在这里插入图片描述

OpenHarmony面试题(内含参考答案):https://qr18.cn/CgxrRy

data-report-view="{"mod":"1585297308_001","spm":"1001.2101.3001.6548","dest":"https://blog.csdn.net/maniuT/article/details/139529136","extend1":"pc","ab":"new"}">> id="blogExtensionBox" style="width:400px;margin:auto;margin-top:12px" class="blog-extension-box"> class="blog_extension blog_extension_type2" id="blog_extension"> class="extension_official" data-report-click="{"spm":"1001.2101.3001.6471"}" data-report-view="{"spm":"1001.2101.3001.6471"}"> class="blog_extension_card_left"> class="blog_extension_card_cont"> 鸿蒙开发学习资料领取!!! class="blog_extension_card_cont_r"> 微信名片
注:本文转载自blog.csdn.net的沧海一笑-dj的文章"https://blog.csdn.net/dengjin20104042056/article/details/98345057"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接

评论记录:

未查询到任何数据!