summaryrefslogtreecommitdiff
path: root/service/src/app.c
diff options
context:
space:
mode:
Diffstat (limited to 'service/src/app.c')
-rw-r--r--service/src/app.c46
1 files changed, 44 insertions, 2 deletions
diff --git a/service/src/app.c b/service/src/app.c
index 1a36b20..aa9aff8 100644
--- a/service/src/app.c
+++ b/service/src/app.c
@@ -11,6 +11,8 @@
#include <ctrlmsg_define.h>
#include <sc_app.h>
+#include <cJSON.h>
+
struct app_event_handler
{
TAILQ_ENTRY(app_event_handler) next;
@@ -21,8 +23,11 @@ struct app_event_handler
/* 控制面监测线程 */
struct app_main
{
- TAILQ_HEAD(app_list, app) app_list;
+ TAILQ_HEAD(app_list, app) app_list;
TAILQ_HEAD(app_event_handler_list, app_event_handler) event_cb[APP_EV_TYPE_MAX];
+
+ /* 保护APP_LIST,该链表可能被应用管理线程和状态监控线程同时访问 */
+ pthread_mutex_t app_list_lock;
};
/* 新连接处理函数
@@ -37,7 +42,10 @@ static int __conn_new_handler(struct ctrlmsg_handler * ct_hand,
ct_conn->pme = app_object;
app_object->conn = ct_conn;
+
+ pthread_mutex_lock(&app_main->app_list_lock);
TAILQ_INSERT_TAIL(&app_main->app_list, app_object, next);
+ pthread_mutex_unlock(&app_main->app_list_lock);
MR_DEBUG("APP module: new ctrlmsg connection arrived. ");
return 0;
@@ -61,10 +69,15 @@ static int __conn_close_handler(struct ctrlmsg_handler * ct_hand,
ev_handler_iter->cb(app_main, app_object, arg);
}
+ /* 应用退出前的操作,删除状态监测文件 */
+ unlink(app_object->mntfile);
MR_INFO("Application %s unregisted.", app_object->symbol);
free_object:
+ pthread_mutex_lock(&app_main->app_list_lock);
TAILQ_REMOVE(&app_main->app_list, app_object, next);
+ pthread_mutex_unlock(&app_main->app_list_lock);
+
FREE(app_object);
return 0;
}
@@ -87,14 +100,22 @@ static int __app_reigster_msg_handler(struct ctrlmsg_handler * ct_hand,
/* 检查应用名称是否重复 */
struct app * app_iter = NULL;
+ pthread_mutex_lock(&app_main->app_list_lock);
TAILQ_FOREACH(app_iter, &app_main->app_list, next)
{
if (strncmp(app_iter->symbol, (const char *)(reg_msg->symbol),
- sizeof(app_object->symbol)) == 0) goto err_dup_app;
+ sizeof(app_object->symbol)) == 0)
+ {
+ pthread_mutex_unlock(&app_main->app_list_lock);
+ goto err_dup_app;
+ }
}
strncpy(app_object->symbol, (const char *)(reg_msg->symbol), sizeof(app_object->symbol));
+ strncpy(app_object->mntfile, (const char *)(reg_msg->mntfile), sizeof(app_object->mntfile));
+ app_object->pid = reg_msg->pid;
app_object->registered = 1;
+ pthread_mutex_unlock(&app_main->app_list_lock);
/* 调用应用注册事件处理回调函数 */
struct app_event_handler * ev_handler_iter;
@@ -143,6 +164,27 @@ int app_main_init(struct sc_main * sc)
return RT_SUCCESS;
}
+cJSON *app_monit_loop(struct sc_main * sc)
+{
+ struct app_main * app_main = sc->app_main;
+ struct cJSON * j_app_array = cJSON_CreateArray();
+ pthread_mutex_lock(&app_main->app_list_lock);
+
+ struct app * app_iter = NULL;
+ TAILQ_FOREACH(app_iter, &app_main->app_list, next)
+ {
+ struct cJSON * j_app_object = cJSON_CreateObject();
+ cJSON_AddStringToObject(j_app_object, "symbol", app_iter->symbol);
+ cJSON_AddNumberToObject(j_app_object, "registed", app_iter->registered);
+ cJSON_AddNumberToObject(j_app_object, "pid", app_iter->pid);
+ cJSON_AddItemToArray(j_app_array, j_app_object);
+
+ }
+
+ pthread_mutex_unlock(&app_main->app_list_lock);
+ return j_app_array;
+}
+
void app_event_handler_register(struct app_main * app_main, enum app_event_type event_type,
app_event_handler_t fn_handler, void * arg)
{