服务端的那些事儿

前情回顾

在之前的博客中,我们介绍了OpenHarmony模块二的结构,也大概阐述了分别以Provider和Consumer为主要角色的服务端和客户端的关系。同时我们还介绍了以samgr_client文件为对象的客户端的功能实现流程。

所有内容回顾如下:

OpenHarmony模块二初分析
OpenHarmony模块二初分析(2)
客户端的那些事儿
客户端那些事儿(2)

功能分析

函数封装

文件的代码开头首先进行了两个函数封装,分别为SamgrServer和ProcFunc两个函数封装包。
代码如下:

static SamgrServer g_server = {
    .GetName = GetName, //获取一个服务要素的名称
    .Initialize = Initialize,   //初始化
    .GetTaskConfig = GetTaskConfig, //定义服务的任务配置
    .MessageHandle = MessageHandle, //处理服务消息
    SERVER_IPROXY_IMPL_BEGIN,   //定义服务器代理类的默认初始化的开始。
        //此宏用于开发服务器代理类,可以继承此宏以减少代码量并防止类定义不一致。

    .Invoke = Invoke,   //从客户端向IServerProxy发送IPC消息
    IPROXY_END,
};

static ProcFunc g_functions[] = {   //进程函数
    [RES_ENDPOINT] = ProcEndpoint,  //进程终端
    [RES_FEATURE] = ProcFeature,    //进程特征
    [RES_SYSCAP] = ProcSysCap,      //进程系统能力
};

封装函数时,被封装进包里的函数并没有被立即执行,而是在调用时执行,这两个函数包在后续的函数功能中会经常被调用。
现在简单介绍一下封装的函数的功能实现流程:

GetName

该函数通过调用一个指针service,返回一个SAMGR_SERVICE,该指针指向需要获取的服务

Initialize

初始化操作,主要是初始化用户调用的服务和身份,在该函数内调用了添加路由器的函数,同时将用户的身份、指向调用的功能的指针返回空值,重新申请了一个新的空间用于存储新的用户的身份和新的指向调用的功能的指针,从而达到初始化的操作。

GetTaskConfig

该函数的功能是定义服务的任务配置,在该函数中,我们能看到它调用了一个TaskConfig函数

static TaskConfig GetTaskConfig(Service *service)   //定义服务的任务配置,用于获取任务管理
{
    (void)service;
    //不能直接使用PRI_BUTT,因此减1
    TaskConfig config = {LEVEL_HIGH, PRI_BUTT - 1, 0x400, 20, SINGLE_TASK}; // Cannot use PRI_BUTT directly, so minus 1
    return config;
}

该函数定义了五个内容,如下:

struct TaskConfig {

    int16 level;  //多服务共享任务的ID。
    int16 priority;  //任务优先级。
    uint16 stackSize;   //任务堆栈的大小
    uint16 queueSize;   //任务队列的大小
    uint8 taskFlags;    //任务类型。
};
#pragma pack()

所以定义服务的任务配置主要是从定义五个任务配置来入手:

  • 多服务共享任务的ID
  • 任务优先级
  • 任务堆栈的大小
  • 任务队列的大小
  • 任务类型

MessageHandle

处理服务消息,首先打开互斥锁,然后调用SASTORA_ClearByPid通过Pid清除旧(使用完毕)的用户服务信息,做完这些步骤之后再关闭互斥锁

static BOOL MessageHandle(Service *service, Request *request)   //处理服务消息
{
    SamgrServer *server = (SamgrServer *)service;
    switch (request->msgId) {
        case MSG_CLEAN:
            MUTEX_Lock(server->mtx);    //互斥锁
            SASTORA_ClearByPid(&server->store, request->msgValue);  //通过Pid清除
            MUTEX_Unlock(server->mtx);  //互斥解锁
            break;
        default:
            break;
    }
    return TRUE;
}

ProcEndpoint

进程终端,用于设置进程结束的节点。
实现流程:首先获取一个呼叫pid,然后打开互斥锁之后,通过该pid查找句柄进行存储,然后通过一个服务手柄,获取呼叫Tid和呼叫uid,再通过Pid保存处理,注销死亡回调,关闭互斥锁。

可以用一个简单的流程图描述:
在这里插入图片描述

ProcFeature

进程特征,该函数用于检测特征值是否设置成功。在函数中,可以根据不同的条件获取三种不同的特征
①IPC身份验证接口;②进程输出特征;③进程获取特征
这些特征的功能和实现流程会在后续中进行介绍

ProcSysCap

该函数用于测试系统能力,首先调用CanRequest函数进行判断检查,在满足条件的情况下不给予权限。若客户获得了权限,则可以进行以下测试功能:
①进程添加系统能力(ProcAddSysCap)
②进程获取系统能力(ProcGetSysCap)
③进程获取所有系统能力(ProcGetAllSysCap)
这些功能的实现流程同样会在后续博客中进行介绍

下期预告

下期我们将对本篇博客中提及的一些功能的实现流程进行介绍,另外补充samgr_server文件下其他的函数的功能。
欲知后事如何,且听下回分解

相关博客

OpenHarmony模块二下文件samgr_server解析(1)
OpenHarmony模块二下文件samgr_server解析(2)
OpenHarmony模块二下文件samgr_server解析(3)
OpenHarmony模块二下文件samgr_server解析(4)
OpenHarmony模块二下文件samgr_server解析(5)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值