处理订阅表被删除但仍然处理消息的异常情况
This commit is contained in:
@@ -15,8 +15,7 @@ typedef enum {
|
||||
MODULE_MAX
|
||||
} has_module_ID_e;
|
||||
|
||||
/* 模块 订阅数量 订阅模块 */
|
||||
/* 模块 和 订阅数量一定要写,完全不加入表中的模块,或订阅数量为0的模块无法接收消息 */
|
||||
/* 格式:模块 订阅数量 订阅模块 */
|
||||
#define SUBSCIBE_INFO \
|
||||
{ \
|
||||
{GUI, 4, {ACM, SENSOR, WIFI, VOICE}}, \
|
||||
|
||||
@@ -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索引
|
||||
|
||||
|
||||
/* 检查ID是否合法,id:检查的ID,ret:不合法时return的结果 */
|
||||
/* 检查ID是否合法,id:检查的ID,ret:不合法时return的值 */
|
||||
#define MSG_CHECK_MODULE_ID(id, ret) \
|
||||
if (((id) >= MODULE_MAX) || ((id) == INVALID_ID)) { \
|
||||
msg_printf("%s ID wrong:%d\n", __func__, (id)); return (ret); }
|
||||
|
||||
/* 检查ID和索引是否合法,id:检查的ID,ret:不合法时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 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
|
||||
memset(g_pub_list, 0, sizeof(g_pub_list));
|
||||
#endif
|
||||
@@ -131,6 +138,11 @@ int has_msg_init()
|
||||
INIT_LIST_HEAD(&g_sub_list[i].msg_list); // 初始化订阅链表
|
||||
}
|
||||
#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++) {
|
||||
// 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++) {
|
||||
@@ -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_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]];
|
||||
|
||||
@@ -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_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);
|
||||
|
||||
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_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]];
|
||||
|
||||
@@ -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_static_sub_list_t *sub_list;
|
||||
unsigned int len = 0;
|
||||
if ((module_id >= MODULE_MAX) || (module_id == INVALID_ID) || (buf_out == NULL)) {
|
||||
msg_printf("%s id of buff wrong:%d\n", __func__, module_id);
|
||||
if (buf_out == NULL) {
|
||||
msg_printf("%s buff is NULL\n", __func__);
|
||||
return 0;
|
||||
}
|
||||
MSG_CHECK_ID_AND_INDEX(module_id, 0);
|
||||
|
||||
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_static_sub_list_t *sub_list;
|
||||
unsigned int len = 0;
|
||||
if ((module_id >= MODULE_MAX) || (module_id == INVALID_ID) || (buf_out == NULL)) {
|
||||
msg_printf("%s id of buff wrong:%d\n", __func__, module_id);
|
||||
if (buf_out == NULL) {
|
||||
msg_printf("%s buff is NULL\n", __func__);
|
||||
return 0;
|
||||
}
|
||||
MSG_CHECK_ID_AND_INDEX(module_id, 0);
|
||||
|
||||
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_static_sub_list_t *sub_list;
|
||||
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]];
|
||||
|
||||
@@ -491,7 +505,7 @@ unsigned int has_msg_get_message_number(has_module_ID_e module_id)
|
||||
has_msg_node_t *node, *temp;
|
||||
has_static_sub_list_t *sub_list;
|
||||
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]];
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
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]];
|
||||
|
||||
@@ -528,7 +542,7 @@ int has_msg_delete_all_message(has_module_ID_e module_id)
|
||||
unsigned char id;
|
||||
INIT_LIST_HEAD(&free_list);
|
||||
#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]];
|
||||
|
||||
@@ -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;
|
||||
int j;
|
||||
if ((module_id >= MODULE_MAX) || (sub_id >= MODULE_MAX)
|
||||
|| (module_id == INVALID_ID) || (sub_id == INVALID_ID)) {
|
||||
if ((sub_id >= MODULE_MAX) || (sub_id == INVALID_ID)) {
|
||||
return -1;
|
||||
}
|
||||
MSG_CHECK_ID_AND_INDEX(module_id, -1);
|
||||
sub_list = &g_sub_list[g_sub_list_index[module_id]];
|
||||
|
||||
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)
|
||||
{
|
||||
has_static_sub_list_t *sub_list;
|
||||
if ((module_id >= MODULE_MAX) || (sub_id >= MODULE_MAX)
|
||||
|| (module_id == INVALID_ID) || (sub_id == INVALID_ID)) {
|
||||
if ((sub_id >= MODULE_MAX) || (sub_id == INVALID_ID)) {
|
||||
return -1;
|
||||
}
|
||||
MSG_CHECK_ID_AND_INDEX(module_id, -1);
|
||||
sub_list = &g_sub_list[g_sub_list_index[module_id]];
|
||||
|
||||
msg_mutex_lock(&sub_list->msg_mutex);
|
||||
|
||||
Reference in New Issue
Block a user