一、前言
本文相关代码实现位于distributedschedule_samgr_lite\communication\broadcast\source\
目录下的broadcast_service.c
和pub_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