OpenHarmony轻量系统服务管理|客户代理的工厂模式机制详解

100 篇文章 1 订阅
100 篇文章 0 订阅

往期知识点记录:

一、前言

本部分相关代码实现位于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);
}
销毁客户端代理
/*
    函数功能:使用工厂方法销毁客户端代理
    函数参数:@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;
}

写在最后

如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙

  • 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
  • 关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识。
  • 想要获取更多完整鸿蒙最新学习资源,请看下图提示:
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值