处理订阅表被删除但仍然处理消息的异常情况

This commit is contained in:
2025-12-29 17:45:47 +08:00
parent f00727780b
commit a4d1600de7
2 changed files with 32 additions and 19 deletions

View File

@@ -15,8 +15,7 @@ typedef enum {
MODULE_MAX MODULE_MAX
} has_module_ID_e; } has_module_ID_e;
/* 模块 订阅数量 订阅模块 */ /* 格式:模块 订阅数量 订阅模块 */
/* 模块 和 订阅数量一定要写完全不加入表中的模块或订阅数量为0的模块无法接收消息 */
#define SUBSCIBE_INFO \ #define SUBSCIBE_INFO \
{ \ { \
{GUI, 4, {ACM, SENSOR, WIFI, VOICE}}, \ {GUI, 4, {ACM, SENSOR, WIFI, VOICE}}, \

View File

@@ -77,15 +77,22 @@ static has_static_sub_list_t g_sub_list[] = SUBSCIBE_INFO;
static unsigned char g_sub_list_index[MODULE_MAX] = {0}; // 订阅表id索引 static unsigned char g_sub_list_index[MODULE_MAX] = {0}; // 订阅表id索引
/* 检查ID是否合法id:检查的IDret:不合法时return的结果 */ /* 检查ID是否合法id:检查的IDret:不合法时return的 */
#define MSG_CHECK_MODULE_ID(id, ret) \ #define MSG_CHECK_MODULE_ID(id, ret) \
if (((id) >= MODULE_MAX) || ((id) == INVALID_ID)) { \ if (((id) >= MODULE_MAX) || ((id) == INVALID_ID)) { \
msg_printf("%s ID wrong:%d\n", __func__, (id)); return (ret); } msg_printf("%s ID wrong:%d\n", __func__, (id)); return (ret); }
/* 检查ID和索引是否合法id:检查的IDret:不合法时return的值 */
#define MSG_CHECK_ID_AND_INDEX(id, ret) \
if (((id) >= MODULE_MAX) || ((id) == INVALID_ID)) { \
msg_printf("%s ID wrong:%d\n", __func__, (id)); return (ret); } \
if (g_sub_list_index[(id)] == MODULE_MAX) { \
return (ret);}
int has_msg_init() int has_msg_init()
{ {
int j; int j;
memset(g_sub_list_index, 0, sizeof(g_sub_list_index)); memset(g_sub_list_index, MODULE_MAX, sizeof(g_sub_list_index));
#ifdef MSG_OPT_PUB_LIST #ifdef MSG_OPT_PUB_LIST
memset(g_pub_list, 0, sizeof(g_pub_list)); memset(g_pub_list, 0, sizeof(g_pub_list));
#endif #endif
@@ -131,6 +138,11 @@ int has_msg_init()
INIT_LIST_HEAD(&g_sub_list[i].msg_list); // 初始化订阅链表 INIT_LIST_HEAD(&g_sub_list[i].msg_list); // 初始化订阅链表
} }
#ifdef MSG_OPT_DEBUG #ifdef MSG_OPT_DEBUG
// msg_printf("show index:\n");
// for (int i = 0; i < MODULE_MAX; i++)
// {
// msg_printf("sub id:%d, index:%d\n", i, g_sub_list_index[i]);
// }
// for (int i = 0; i < (sizeof(g_sub_list) / sizeof(g_sub_list[0])); i++) { // for (int i = 0; i < (sizeof(g_sub_list) / sizeof(g_sub_list[0])); i++) {
// msg_printf("module:%d subscribes to:\n", g_sub_list[i].module_id); // msg_printf("module:%d subscribes to:\n", g_sub_list[i].module_id);
// for (int x = 0; x < g_sub_list[i].sub_module_cnt; x++) { // for (int x = 0; x < g_sub_list[i].sub_module_cnt; x++) {
@@ -260,7 +272,7 @@ int has_msg_handle(has_module_ID_e module_id, has_msg_handle_cb cb)
{ {
has_msg_node_t *node; has_msg_node_t *node;
has_static_sub_list_t *sub_list; has_static_sub_list_t *sub_list;
MSG_CHECK_MODULE_ID(module_id, -1); MSG_CHECK_ID_AND_INDEX(module_id, -1);
sub_list = &g_sub_list[g_sub_list_index[module_id]]; sub_list = &g_sub_list[g_sub_list_index[module_id]];
@@ -297,7 +309,7 @@ int has_msg_handle_by_module(has_module_ID_e module_id, has_msg_handle_cb cb, ha
{ {
has_msg_node_t *node, *temp; has_msg_node_t *node, *temp;
has_static_sub_list_t *sub_list; has_static_sub_list_t *sub_list;
MSG_CHECK_MODULE_ID(module_id, -1); MSG_CHECK_ID_AND_INDEX(module_id, -1);
MSG_CHECK_MODULE_ID(pub_module_id, -1); MSG_CHECK_MODULE_ID(pub_module_id, -1);
sub_list = &g_sub_list[g_sub_list_index[module_id]]; sub_list = &g_sub_list[g_sub_list_index[module_id]];
@@ -343,7 +355,7 @@ int has_msg_handle_latest(has_module_ID_e module_id, has_msg_handle_cb cb)
{ {
has_msg_node_t *node; has_msg_node_t *node;
has_static_sub_list_t *sub_list; has_static_sub_list_t *sub_list;
MSG_CHECK_MODULE_ID(module_id, -1); MSG_CHECK_ID_AND_INDEX(module_id, -1);
sub_list = &g_sub_list[g_sub_list_index[module_id]]; sub_list = &g_sub_list[g_sub_list_index[module_id]];
@@ -383,10 +395,11 @@ unsigned int has_msg_receive(has_module_ID_e module_id, unsigned char *pub_modul
has_msg_node_t *node; has_msg_node_t *node;
has_static_sub_list_t *sub_list; has_static_sub_list_t *sub_list;
unsigned int len = 0; unsigned int len = 0;
if ((module_id >= MODULE_MAX) || (module_id == INVALID_ID) || (buf_out == NULL)) { if (buf_out == NULL) {
msg_printf("%s id of buff wrong:%d\n", __func__, module_id); msg_printf("%s buff is NULL\n", __func__);
return 0; return 0;
} }
MSG_CHECK_ID_AND_INDEX(module_id, 0);
sub_list = &g_sub_list[g_sub_list_index[module_id]]; sub_list = &g_sub_list[g_sub_list_index[module_id]];
@@ -427,10 +440,11 @@ unsigned int has_msg_receive_latest(has_module_ID_e module_id, unsigned char *pu
has_msg_node_t *node; has_msg_node_t *node;
has_static_sub_list_t *sub_list; has_static_sub_list_t *sub_list;
unsigned int len = 0; unsigned int len = 0;
if ((module_id >= MODULE_MAX) || (module_id == INVALID_ID) || (buf_out == NULL)) { if (buf_out == NULL) {
msg_printf("%s id of buff wrong:%d\n", __func__, module_id); msg_printf("%s buff is NULL\n", __func__);
return 0; return 0;
} }
MSG_CHECK_ID_AND_INDEX(module_id, 0);
sub_list = &g_sub_list[g_sub_list_index[module_id]]; sub_list = &g_sub_list[g_sub_list_index[module_id]];
@@ -472,7 +486,7 @@ unsigned int has_msg_is_message_empty(has_module_ID_e module_id)
has_msg_node_t *node, *temp; has_msg_node_t *node, *temp;
has_static_sub_list_t *sub_list; has_static_sub_list_t *sub_list;
unsigned int num = 0; unsigned int num = 0;
MSG_CHECK_MODULE_ID(module_id, -1); MSG_CHECK_ID_AND_INDEX(module_id, -1);
sub_list = &g_sub_list[g_sub_list_index[module_id]]; sub_list = &g_sub_list[g_sub_list_index[module_id]];
@@ -491,7 +505,7 @@ unsigned int has_msg_get_message_number(has_module_ID_e module_id)
has_msg_node_t *node, *temp; has_msg_node_t *node, *temp;
has_static_sub_list_t *sub_list; has_static_sub_list_t *sub_list;
unsigned int num = 0; unsigned int num = 0;
MSG_CHECK_MODULE_ID(module_id, 0); MSG_CHECK_ID_AND_INDEX(module_id, 0);
sub_list = &g_sub_list[g_sub_list_index[module_id]]; sub_list = &g_sub_list[g_sub_list_index[module_id]];
@@ -506,7 +520,7 @@ unsigned int has_msg_get_message_number(has_module_ID_e module_id)
int has_msg_printf_subscribe(has_module_ID_e module_id) int has_msg_printf_subscribe(has_module_ID_e module_id)
{ {
has_static_sub_list_t *sub_list; has_static_sub_list_t *sub_list;
MSG_CHECK_MODULE_ID(module_id, -1); MSG_CHECK_ID_AND_INDEX(module_id, -1);
sub_list = &g_sub_list[g_sub_list_index[module_id]]; sub_list = &g_sub_list[g_sub_list_index[module_id]];
@@ -528,7 +542,7 @@ int has_msg_delete_all_message(has_module_ID_e module_id)
unsigned char id; unsigned char id;
INIT_LIST_HEAD(&free_list); INIT_LIST_HEAD(&free_list);
#endif #endif
MSG_CHECK_MODULE_ID(module_id, -1); MSG_CHECK_ID_AND_INDEX(module_id, -1);
sub_list = &g_sub_list[g_sub_list_index[module_id]]; sub_list = &g_sub_list[g_sub_list_index[module_id]];
@@ -572,10 +586,10 @@ int has_msg_subscribe(has_module_ID_e module_id, has_module_ID_e sub_id)
{ {
has_static_sub_list_t *sub_list; has_static_sub_list_t *sub_list;
int j; int j;
if ((module_id >= MODULE_MAX) || (sub_id >= MODULE_MAX) if ((sub_id >= MODULE_MAX) || (sub_id == INVALID_ID)) {
|| (module_id == INVALID_ID) || (sub_id == INVALID_ID)) {
return -1; return -1;
} }
MSG_CHECK_ID_AND_INDEX(module_id, -1);
sub_list = &g_sub_list[g_sub_list_index[module_id]]; sub_list = &g_sub_list[g_sub_list_index[module_id]];
msg_mutex_lock(&sub_list->msg_mutex); msg_mutex_lock(&sub_list->msg_mutex);
@@ -604,10 +618,10 @@ int has_msg_subscribe(has_module_ID_e module_id, has_module_ID_e sub_id)
int has_msg_unsubscribe(has_module_ID_e module_id, has_module_ID_e sub_id) int has_msg_unsubscribe(has_module_ID_e module_id, has_module_ID_e sub_id)
{ {
has_static_sub_list_t *sub_list; has_static_sub_list_t *sub_list;
if ((module_id >= MODULE_MAX) || (sub_id >= MODULE_MAX) if ((sub_id >= MODULE_MAX) || (sub_id == INVALID_ID)) {
|| (module_id == INVALID_ID) || (sub_id == INVALID_ID)) {
return -1; return -1;
} }
MSG_CHECK_ID_AND_INDEX(module_id, -1);
sub_list = &g_sub_list[g_sub_list_index[module_id]]; sub_list = &g_sub_list[g_sub_list_index[module_id]];
msg_mutex_lock(&sub_list->msg_mutex); msg_mutex_lock(&sub_list->msg_mutex);