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

70 阅读3分钟

一、前言

本部分代码位于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;
};
DD一下:欢迎大家关注公众号<程序猿百晓生>,可以了解到一下知识点。
1.OpenHarmony开发基础
2.OpenHarmony北向开发环境搭建
3.鸿蒙南向开发环境的搭建
4.鸿蒙生态应用开发白皮书V2.0 & V3.0
5.鸿蒙开发面试真题(含参考答案) 
6.TypeScript入门学习手册
7.OpenHarmony 经典面试题(含参考答案)
8.OpenHarmony设备开发入门【最新版】
9.沉浸式剖析OpenHarmony源代码
10.系统定制指南
11.【OpenHarmony】Uboot 驱动加载流程
12.OpenHarmony构建系统--GN与子系统、部件、模块详解
13.ohos开机init启动流程
14.鸿蒙版性能优化指南
.......

三、函数实现详解

查询指定名称的服务
//根据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;
}