diff options
Diffstat (limited to 'service/src/app.c')
| -rw-r--r-- | service/src/app.c | 46 |
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) { |
