一、前言
本部分相关代码实现位于distributedschedule_samgr_lite\samgr_endpoint\source\client_factory.c。
二、数据结构分析
struct Factory {
SaName key; //sa的标识,包含service的name和feature的name
Creator creator; //客户端代理的创建器,函数指针
Destroyer destroyer; //客户端代理的销毁器,函数指针
};
static Vector g_factories; //用于存储factory对象
static MutexId g_mutex; //全局锁
函数实现详解
创建客户端代理
/*
函数功能:使用工厂方法创建客户端代理
函数参数:@service:服务名称
@feature:功能名称
@size:客户端代理的头部大小
函数描述:在g_factories中查询指定服务和功能的工厂对象,然后调用工厂中的创建方法,创建指定的服务和功能的客户端代理
*/
void *SAMGR_CreateIClient(const char *service, const char *feature, uint32 size)
{
if (service == NULL) {
return NULL;
}
if (g_mutex == NULL) {
return NULL;
}
//根据service和feature获取factory对象
Factory *factory = GetFactory(service, feature);
if (factory == NULL) {
return NULL;
}
//调用指定服务和功能的代理创建器,创建iClient
return factory->creator(service, feature, size);
}
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:服务名称
@feature:功能名称
@size:客户端代理
函数描述:在g_factories中查询指定服务和功能的工厂对象,然后调用工厂中的销毁方法,销毁指定的服务和功能的客户端代理
*/
int SAMGR_ReleaseIClient(const char *service, const char *feature, void *iClient)
{
//参数检查
if (service == NULL || iClient == NULL) {
return EC_INVALID;
}
if (g_mutex == NULL) {
return EC_NOHANDLER;
}
//根据service和feature获取factory对象
Factory *factory = GetFactory(service, feature);
if (factory == NULL) {
return EC_NOHANDLER;
}
//调用指定服务和功能的代理销毁器,销毁iClient,回收资源
factory->destroyer(service, feature, iClient);
return EC_SUCCESS;
}
注册服务和功能的工厂方法
/*
函数功能:注册指定服务和功能的工厂对象
函数参数:@service:服务名称
@feature:功能名称
@creator:客户端代理的创建方法
@destroyer:客户端代理的销毁方法
函数描述:将指定服务和功能的工厂对象注册到全局的factories中。工厂对象负责服务和功能的客户端代理创建和销毁。
*/
int SAMGR_RegisterFactory(const char *service, const char *feature, Creator creator, Destroyer destroyer)
{
//参数检查
if (service == NULL || creator == NULL || destroyer == NULL) {
return EC_INVALID;
}
//若全局锁为NULL,则需要进行资源的初始化
if (g_mutex == NULL) {
//创建全局的factories,管理和维护factory
//指定SAMGR_CompareSAName作为key值的比较函数,用于比较SaName类型的key值
g_factories = VECTOR_Make(NULL, (VECTOR_Compare)SAMGR_CompareSAName);
//申请一个已初始化的锁
g_mutex = MUTEX_InitValue();
if (g_mutex == NULL) {
return EC_NOMEMORY;
}
}
//根据service和feature获取factory对象
Factory *factory = GetFactory(service, feature);
if (factory != NULL) {
//指定服务和功能的工厂对象已存在,不需要再注册
return EC_SUCCESS;
}
//不存在与service和feature关联的factory对象,需要注册
//加锁,保证互斥
MUTEX_Lock(g_mutex);
//申请工厂对象的内存
factory = SAMGR_Malloc(sizeof(Factory));
if (factory == NULL) {
MUTEX_Unlock(g_mutex);
//内存申请失败
return EC_NOMEMORY;
}
//为新创建的工厂对象赋值
factory->key.service = service;//服务名称
factory->key.feature = feature;//功能名称
factory->creator = creator;//客户端代理创建的方法
factory->destroyer = destroyer;//客户端代理销毁的方法
//注册这个工厂对象,将当前的factory对象添加到g_factories的data中
int ret = VECTOR_Add(&g_factories, factory);
MUTEX_Unlock(g_mutex);
if (ret == INVALID_INDEX) {
//添加失败,释放资源
SAMGR_Free(factory);
return EC_NOMEMORY;
}
return EC_SUCCESS;
}
获取服务和功能的工厂方法
/*
函数功能:获取指定服务和功能的工厂对象
函数参数:@service:服务名称
@feature:功能名称
函数返回:查询成功 返回该工厂对象,查询失败 返回NULL
*/
static Factory *GetFactory(const char *service, const char *feature)
{
//标识唯一的服务和功能,作为键值
SaName key = {service, feature};
Factory *factory = NULL;
//加锁
MUTEX_Lock(g_mutex);
//通过key查询g_factories中存储的factory对象,返回下标
int index = VECTOR_FindByKey(&g_factories, &key);
if (index != INVALID_INDEX) {//匹配到该对象
//按下标获取对象
factory = VECTOR_At(&g_factories, index);
}
//解锁
MUTEX_Unlock(g_mutex);
return factory;
}