📌往期推文全新看点(文中附带最新·鸿蒙全栈学习笔记)
📃 鸿蒙(HarmonyOS)北向开发知识点记录~
📃 鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~
📃 鸿蒙应用开发与鸿蒙系统开发哪个更有前景?
📃 嵌入式开发适不适合做鸿蒙南向开发?看完这篇你就了解了~
📃 对于大前端开发来说,转鸿蒙开发究竟是福还是祸?
📃 鸿蒙岗位需求突增!移动端、PC端、IoT到底该怎么选?
📃 记录一场鸿蒙开发岗位面试经历~
📃 持续更新中……
一、前言
本部分代码位于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;
}