summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQiuwen Lu <[email protected]>2017-08-10 12:27:41 +0800
committerQiuwen Lu <[email protected]>2017-08-10 12:27:41 +0800
commitacecbd318e44068f7788e42eb15257d79fe0e58a (patch)
treeddcf04d280e0635213b4ce68d6ec38f23a9faa6d
parentc63fa2c373a96e1452a14ce1f3e41aab58e6a1fe (diff)
增加应用状态列表及输出功能,增加应用统计信息文件自动删除功能。v4.2.14-20170811
- 增加应用状态列表。在服务进程的状态输出中增加正在运行的应用列表输出。可以获得应用的名称、进程号(PID)等信息; - 增加应用统计信息文件自动删除功能。应用退出后,由服务进程对应用的状态统计信息文件(mrmonit.app.*)进行删除。
-rw-r--r--app/src/marsio.c6
-rw-r--r--include/internal/ctrlmsg_define.h2
-rw-r--r--service/include/sc_app.h5
-rw-r--r--service/src/app.c46
-rw-r--r--service/src/monit.c3
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 *)(&reg_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;
}