diff options
| author | Qiuwen Lu <[email protected]> | 2017-08-10 12:27:41 +0800 |
|---|---|---|
| committer | Qiuwen Lu <[email protected]> | 2017-08-10 12:27:41 +0800 |
| commit | acecbd318e44068f7788e42eb15257d79fe0e58a (patch) | |
| tree | ddcf04d280e0635213b4ce68d6ec38f23a9faa6d | |
| parent | c63fa2c373a96e1452a14ce1f3e41aab58e6a1fe (diff) | |
增加应用状态列表及输出功能,增加应用统计信息文件自动删除功能。v4.2.14-20170811
- 增加应用状态列表。在服务进程的状态输出中增加正在运行的应用列表输出。可以获得应用的名称、进程号(PID)等信息;
- 增加应用统计信息文件自动删除功能。应用退出后,由服务进程对应用的状态统计信息文件(mrmonit.app.*)进行删除。
| -rw-r--r-- | app/src/marsio.c | 6 | ||||
| -rw-r--r-- | include/internal/ctrlmsg_define.h | 2 | ||||
| -rw-r--r-- | service/include/sc_app.h | 5 | ||||
| -rw-r--r-- | service/src/app.c | 46 | ||||
| -rw-r--r-- | service/src/monit.c | 3 |
5 files changed, 59 insertions, 3 deletions
diff --git a/app/src/marsio.c b/app/src/marsio.c index 7e6751b..1bcfe08 100644 --- a/app/src/marsio.c +++ b/app/src/marsio.c @@ -232,7 +232,13 @@ static int mrapp_app_register(struct mr_instance * instance) CTRL_MSG_TYPE_REQUEST, CTRLMSG_TOPIC_APP_REGISTER); + /* 应用标识符 */ strncpy((char *)reg_cmd.symbol, instance->appsym, sizeof(reg_cmd.symbol)); + /* 状态监控文件,委托服务进程销毁 */ + strncpy((char *)reg_cmd.mntfile, instance->monit_file_path, sizeof(reg_cmd.mntfile)); + /* 进程号,便于应用跟踪,查找问题 */ + reg_cmd.pid = getpid(); + ctrlmsg_msg_send(instance->ctrlmsg_handler, NULL, (struct ctrl_msg_header *)(®_cmd)); /* TODO: 抽象出单独的函数 */ diff --git a/include/internal/ctrlmsg_define.h b/include/internal/ctrlmsg_define.h index 66c2704..8421202 100644 --- a/include/internal/ctrlmsg_define.h +++ b/include/internal/ctrlmsg_define.h @@ -14,6 +14,8 @@ struct ctrl_msg_app_reg_request { struct ctrl_msg_header msg_header; uint8_t symbol[MR_SYMBOL_MAX]; + uint8_t mntfile[MR_STRING_MAX]; + pid_t pid; } __rte_packed; struct ctrl_msg_app_reg_response diff --git a/service/include/sc_app.h b/service/include/sc_app.h index bdcaae8..e58a240 100644 --- a/service/include/sc_app.h +++ b/service/include/sc_app.h @@ -15,7 +15,10 @@ struct app struct ctrlmsg_conn * conn; /* 是否已经注册,(对于仅进行控制面操作的程序,不需要注册) */ unsigned int registered; - + /* 进程号 */ + pid_t pid; + /* 监控文件路径 */ + char mntfile[MR_STRING_MAX]; /* 虚设备管理模块在APP中的保存的上下文 */ void * pme_vdev_main; }; 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) { diff --git a/service/src/monit.c b/service/src/monit.c index 447fa47..c606666 100644 --- a/service/src/monit.c +++ b/service/src/monit.c @@ -239,6 +239,7 @@ static cJSON * monit_service_info(struct sc_main * sc) } extern cJSON * mrb_monit_loop(struct sc_main * sc); +extern cJSON * app_monit_loop(struct sc_main * sc); static cJSON * monit_root(struct sc_main * sc) { @@ -247,6 +248,8 @@ static cJSON * monit_root(struct sc_main * sc) cJSON_AddItemToObject(j_root, "device", monit_device_info(sc)); cJSON_AddItemToObject(j_root, "raw", monit_vdev(sc)); cJSON_AddItemToObject(j_root, "mrb", mrb_monit_loop(sc)); + cJSON_AddItemToObject(j_root, "app", app_monit_loop(sc)); + return j_root; } |
