OpenHarmony轻量系统服务管理|消息广播服务及其子功能详解

一、前言

本文相关代码实现位于distributedschedule_samgr_lite\communication\broadcast\source\目录下的broadcast_service.cpub_sub_feature.c。 本文将对以下数据结构及函数进行详解。

    struct BroadcastService:
    struct ConsumerNode:
    struct Relation:
    struct PubSubFeature:
    在broadcast_service.c中
    Init:注册广播服务
    GetName:获取广播服务的名称
    Initialize:广播服务的初始化函数
    MessageHandle:广播服务的消息处理函数
    GetTaskConfig:获取广播服务的任务配置
    在pub_sub_feature.c中
    Init:初始化全局广播变量
    GetName:获取功能名称
    OnInitialize:初始化ID
    OnStop:停止功能
    OnMessage:广播子功能的消息处理函数
    GetRelation:获取子功能与主题的关系
    IsTopicEqual:判断两个主题是否相等

二、数据结构分析

广播服务的数据结构
//广播服务消息类型
enum BroadcastMsgType {
    BROADCAST_MSG,      //消息类型
};
typedef struct BroadcastService BroadcastService;
//广播服务
struct BroadcastService {
    INHERIT_SERVICE;    //继承服务基类
};
//全局广播服务
static BroadcastService g_broadcastService = {
    GetName,
    Initialize,
    MessageHandle,
    GetTaskConfig,
};
广播服务子功能
//消费者结点
typedef struct ConsumerNode {
    UTILS_DL_LIST node;     //双向链表,包含prev和next指针
    Consumer *consumer;     //消费者
} ConsumerNode;
//关系,topic和消费者,一个topic对应多个消费者,消费者存储在双向链表中
typedef struct Relation {
    UTILS_DL_LIST node;     //双向链表,包含prev和next指针
    ConsumerNode callbacks; //消费者结点集合,为一个双向循环链表
    Topic topic;            //消息标识
} Relation;
typedef struct PubSubFeature PubSubFeature;
//一个id对应一个关系双向链表,关系中又包含了一个topic和一个消费者双向链表
//一个PubSubFeature结点可以由identity标识,包含一系列关系组合
//一个relation结点可以由topic标识,包含一组消费者集合
struct PubSubFeature {
    INHERIT_FEATURE;    //继承功能基类
    //函数指针,用于获取指定功能下的topic和消费者的关系
    Relation *(*GetRelation)(PubSubFeature *feature, const Topic *topic);
    MutexId mutex;          //锁
    Relation relations;     //关系,双向循环链表
    Identity identity;      //身份标识,标识服务ID、功能ID和消息队列ID
};

三、函数实现详解

广播服务的函数

注册广播服务
//注册广播服务
static void Init(void)
{
    SAMGR_GetInstance()->RegisterService((Service *)&g_broadcastService);
}
SYS_SERVICE_INIT(Init);
获取服务名称
//获取广播服务的名称
static const cha
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值