OpenHarmony轻量系统服务管理|系统功能的存储机制详解(一)

100 篇文章 1 订阅
100 篇文章 0 订阅

往期知识点记录:

一、前言

本部分代码位于distributedschedule_samgr_lite\samgr_endpoint\source\sa_store.c

二、宏定义及数据结构

#define MAX_NAME_LEN 16   //名称的最大字符个数
#define GROW_STEP 4         //增长步长
#define MAX_SA_NUM 300      //sastore维护的最大结点数
//service信息,包含一个FeatureNode的链表
struct ServiceInfo {
    char name[MAX_NAME_LEN];//服务的名称
    uint32 handle;          //来自SvcIdentity中的handle,在向主endpoint注册时获得
    FeatureNode *head;      //当前服务包含的子功能,通过链表记录
};
//feature结点
struct FeatureNode {
    char name[MAX_NAME_LEN];//feature的名称
    uint32 isDefault;//标识当前结点是否为默认结点,在创建时,若feature为NULL,则为true
    uint32 token;    //来自SvcIdentity中的token,标识服务和功能在routers中的下标
    FeatureNode *next;//指向下一个feature结点
};
//系统功能的存储结构,root中维护一堆Service信息,而服务下面还挂着一堆功能
//maps中从小到大维护一堆进程id和用户id的对应关系
struct SAStore {
    int saSize;       //维护的featureNode节点个数
    ListNode *root;   //链表的根,挂着服务结点
    int16 mapSize;    //记录maps所指向的连续内存空间的个数,每个大小为sizeof(PidHandle)
    int16 mapTop;     //记录maps中存储的元素个数
    PidHandle *maps;  //指向一块有序的连续内存空间,按照PidHandle中的pid从小到大,maps中元素的个数即ListNode的个数,由handle对应
};
//链表结点,每个结点包含一个service信息,每个service都包含一个feature链表
struct ListNode {
    ListNode *next;//指向下一个结点
    ServiceInfo info;//服务的信息
};
//pid句柄,进程关系
struct PidHandle {
    pid_t pid;      //进程ID
    uid_t uid;      //用户ID
    uint32 handle;  //来自SvcIdentity中的handle
    uint32 deadId;
};

三、函数实现详解

查询指定名称的服务
//根据service的name查找ListNode中是否有该service,成功 返回结点指针,失败 返回NULL
static inline ListNode *FindServiceByName(ListNode *curNode, const char *service)
{
    while (curNode != NULL) {
        //判断ListNode链表中的serviceinfo中是否有该服务
        if (strncmp(curNode->info.name, service, MAX_NAME_LEN) == 0) {
            break;
        }
        curNode = curNode->next;
    }
    return curNode;
}
查询指定名称的功能
/*
    函数功能:在FeatureNode链表中,根据feature的name查找对应的结点
    函数返回:当feature为NULL并且当前结点为默认结点时,返回默认结点
             当feature非NULL并且与当前结点的name匹配时,返回当前结点
             查找失败返回NULL
*/
static inline FeatureNode *FindFeatureByName(FeatureNode *curNode, const char *feature)
{
    while (curNode != NULL) {
        //根据isDefault和feature的name来判断
        if ((feature == NULL && curNode->isDefault) ||
            (feature != NULL && strncmp(curNode->name, feature, MAX_NAME_LEN) == 0)) {
            break;
        }
        curNode = curNode->next;
    }
    return curNode;
}

写在最后

如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙

  • 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
  • 关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识。
  • 想要获取更多完整鸿蒙最新学习资源,请看下图提示:
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值