往期知识点记录:
- 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总
- OpenHarmony轻量系统服务管理-samgr主要接口思维导图(1)
- OpenHarmony轻量系统服务管理-samgr主要接口思维导图(2)
- OpenHarmony轻量系统服务管理-samgr:common赏析及实现
- OpenHarmony轻量系统服务管理-samgr:iunknown赏析
- OpenHarmony轻量系统服务管理-samgr:iunknown实现分析
- OpenHarmony轻量系统服务管理samgr-message赏析
- OpenHarmony轻量系统服务管理samgr-message实现分析(1)
- OpenHarmony轻量系统服务管理samgr-message实现分析(2)
- OpenHarmony轻量系统服务管理samgr-service赏析
- OpenHarmony轻量系统服务管理samgr-samgr_lite赏析
- OpenHarmony轻量系统服务管理samgr-feature赏析及实现
- OpenHarmony轻量系统服务管理samgr-service实现分析(1)
- OpenHarmony轻量系统服务管理samgr-service实现分析(2)
- OpenHarmony轻量系统服务管理samgr-task_manager赏析及实现(1)
- OpenHarmony轻量系统服务管理samgr-task_manager赏析及实现(2)
- OpenHarmony轻量系统服务管理|samgr_lite功能详解(一)
- OpenHarmony轻量系统服务管理|samgr_lite功能详解(二)
- OpenHarmony轻量系统服务管理|samgr_lite功能详解(三)
- OpenHarmony轻量系统服务管理|samgr_lite功能详解(四)
- OpenHarmony轻量系统服务管理|samgr_client功能详解
- OpenHarmony轻量系统服务管理|消息处理中的流控机制详解
- OpenHarmony轻量系统服务管理|系统功能的存储机制详解(一)
- 持续更新中……
一、前言
本部分代码位于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🚀,不定期分享原创知识。
- 想要获取更多完整鸿蒙最新学习资源,请看下图提示: