summaryrefslogtreecommitdiff
path: root/src/project
diff options
context:
space:
mode:
authorlijia <[email protected]>2021-02-24 18:21:46 +0800
committerlijia <[email protected]>2021-02-24 18:21:46 +0800
commit46ca20894982e83c1d39cf12314751eef594b8ca (patch)
tree2322f194bafe07abf212eb4c411dac948611271a /src/project
parentbc96e26649512ed16fb00d7da420ea6da1e19b32 (diff)
TSG-5516, project接口增加主动通知功能.
Diffstat (limited to 'src/project')
-rw-r--r--src/project/project_requirement.c65
1 files changed, 65 insertions, 0 deletions
diff --git a/src/project/project_requirement.c b/src/project/project_requirement.c
index 28f84b8..97e2f2c 100644
--- a/src/project/project_requirement.c
+++ b/src/project/project_requirement.c
@@ -4,6 +4,7 @@ extern "C" {
#include "sapp_api.h"
#include "sapp_private_api.h"
+#include "MESA_list.h"
//extern int g_packet_io_thread_num;
extern int project_req_terminal_tag_init(void);
@@ -30,12 +31,18 @@ struct pro_req_type{
char *type_str;
};
+typedef struct{
+ project_notify_cb_t *callback_fun;
+ void *notify_callback_user_arg;
+}project_callback_para_t;
+
typedef struct project_req_m{
int project_req_id;
char project_req_name[PROJECT_REQ_NAME_MAX_LEN];
project_req_free_t *free_cb;
int project_req_type;
+ MESA_list_t nofity_callback_fun_list;
}project_req_manage_t;
struct project_req_info{
@@ -165,6 +172,57 @@ int project_customer_register(const char *project_req_name, const char *project_
return __project_find_id_by_name(project_req_name, project_req_val_type);
}
+int project_customer_register_with_notify(const char *project_req_name, const char *project_req_val_type, project_notify_cb_t callback_fun, void *user_arg)
+{
+ int project_id;
+ struct MESA_list *new_list_node;
+ project_callback_para_t *new_callback;
+
+ if(NULL == callback_fun){
+ return -1;
+ }
+
+ project_id = project_customer_register(project_req_name, project_req_val_type);
+ if(project_id < 0){
+ return -1;
+ }
+
+ new_list_node = (struct MESA_list *)malloc(sizeof(struct MESA_list));
+ new_callback = (project_callback_para_t *)malloc(sizeof(project_callback_para_t));
+ new_callback->callback_fun = callback_fun;
+ new_callback->notify_callback_user_arg = user_arg;
+
+ new_list_node->quiddity = new_callback;
+
+ MESA_list_add(&G_PROJECT_REQ_MANAGE[project_id].nofity_callback_fun_list, new_list_node);
+
+ return project_id;
+}
+
+
+int project_producer_notify(const struct streaminfo *stream, int project_req_id, void *a_packet)
+{
+ MESA_list_t *list_node;
+ project_callback_para_t *callback_para;
+
+ if((project_req_id < 0) || (project_req_id >= PROJECT_REQ_MAX_PLUG_NUM)){
+ sapp_runtime_log(30, "project_producer_notify() error, invalid project_id:%d", project_req_id);
+ return -1;
+ }
+
+ list_node = G_PROJECT_REQ_MANAGE[project_req_id].nofity_callback_fun_list.nextele;
+ while(list_node != &G_PROJECT_REQ_MANAGE[project_req_id].nofity_callback_fun_list){
+ callback_para = (project_callback_para_t *)list_node->quiddity;
+ if(callback_para->callback_fun){
+ callback_para->callback_fun(stream, project_req_id, a_packet, callback_para->notify_callback_user_arg);
+ }
+ list_node = list_node->nextele;
+ }
+
+ return 0;
+}
+
+
int parse_project_req_conf(void)
{
@@ -497,7 +555,9 @@ static int udp_flow_stat_init(void)
static void project_env_init()
{
+ int i;
MESA_htable_create_args_t hargs;
+
memset(&hargs, 0, sizeof(MESA_htable_create_args_t));
hargs.thread_safe = 0;
hargs.hash_slot_size = PROJECT_REQ_MAX_PLUG_NUM;
@@ -518,6 +578,11 @@ static void project_env_init()
MESA_htable_destroy(G_PROJECT_NAME_HASH, NULL);
}
}
+
+ for(i = 0; i < PROJECT_REQ_MAX_PLUG_NUM; i++){
+ MESA_list_init_head(&G_PROJECT_REQ_MANAGE[i].nofity_callback_fun_list);
+ }
+
return;
}