diff options
| author | lijia <[email protected]> | 2021-02-24 18:21:46 +0800 |
|---|---|---|
| committer | lijia <[email protected]> | 2021-02-24 18:21:46 +0800 |
| commit | 46ca20894982e83c1d39cf12314751eef594b8ca (patch) | |
| tree | 2322f194bafe07abf212eb4c411dac948611271a /src/project | |
| parent | bc96e26649512ed16fb00d7da420ea6da1e19b32 (diff) | |
TSG-5516, project接口增加主动通知功能.
Diffstat (limited to 'src/project')
| -rw-r--r-- | src/project/project_requirement.c | 65 |
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;
}
|
