一、前言
本部分代码位于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;
}