From 796883fb989f6993b34704f48e218b2c69c60d3a Mon Sep 17 00:00:00 2001 From: zhangzheng <1358745329@qq.com> Date: Sun, 10 Dec 2023 00:34:47 +0800 Subject: [PATCH] =?UTF-8?q?pm=E6=94=AF=E6=8C=81=E9=80=89=E6=8B=A9=E6=98=AF?= =?UTF-8?q?=E5=90=A6=E5=AE=8C=E5=85=A8=E5=88=A0=E9=99=A4=E8=BF=9B=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mkrtos_user/lib/sys_svr/inc/pm_cli.h | 1 + mkrtos_user/server/init/src/namespace.c | 21 ++++++++++++++------- mkrtos_user/server/init/src/namespace.h | 2 +- mkrtos_user/server/init/src/pm.c | 2 +- 4 files changed, 17 insertions(+), 9 deletions(-) diff --git a/mkrtos_user/lib/sys_svr/inc/pm_cli.h b/mkrtos_user/lib/sys_svr/inc/pm_cli.h index cf589fc0e..964b62dde 100644 --- a/mkrtos_user/lib/sys_svr/inc/pm_cli.h +++ b/mkrtos_user/lib/sys_svr/inc/pm_cli.h @@ -1,3 +1,4 @@ #pragma once int pm_run_app(const char *path, int flags); +int pm_kill_task(int pid, int flags); diff --git a/mkrtos_user/server/init/src/namespace.c b/mkrtos_user/server/init/src/namespace.c index 53c94660e..b5e12a223 100644 --- a/mkrtos_user/server/init/src/namespace.c +++ b/mkrtos_user/server/init/src/namespace.c @@ -29,7 +29,7 @@ static ns_t ns; static fs_t ns_fs; int ns_reg(const char *path, obj_handler_t hd, enum node_type type); int ns_node_free(ns_node_t *node); -static void _ns_node_del_by_pid(slist_head_t *head, pid_t pid) +static void _ns_node_del_by_pid(slist_head_t *head, pid_t pid, int to_del) { ns_node_t *pos; @@ -41,20 +41,26 @@ static void _ns_node_del_by_pid(slist_head_t *head, pid_t pid) { if (pid == pos->pid) { - ns_node_free(pos); + if (ns_node_free(pos) == 0) + { + if (to_del) + { + task_unmap(TASK_THIS, vpage_create_raw3(KOBJ_DELETE_RIGHT, 0, pos->node_hd)); + } + } } } else { - _ns_node_del_by_pid(&pos->sub_dir, pid); + _ns_node_del_by_pid(&pos->sub_dir, pid, to_del); } pos = next; } } -void ns_node_del_by_pid(pid_t pid) +void ns_node_del_by_pid(pid_t pid, int to_del) { - _ns_node_del_by_pid(&ns.root_node.sub_dir, pid); + _ns_node_del_by_pid(&ns.root_node.sub_dir, pid, to_del); } static ns_node_t *node_init(ns_node_t *new_node, ns_node_t *parent, const char *name, obj_handler_t hd, enum node_type type) { @@ -206,6 +212,7 @@ end: */ int ns_node_free(ns_node_t *node) { + int ref = 0; if (!node) { return 0; @@ -216,6 +223,7 @@ int ns_node_free(ns_node_t *node) ns_node_free(node->parent); } node->ref--; + ref = node->ref; if (node->ref <= 0) { switch (node->type) @@ -236,7 +244,7 @@ int ns_node_free(ns_node_t *node) } free(node); } - return node->ref; + return ref; } int fs_svr_open(const char *path, int flags, int mode) { @@ -474,7 +482,6 @@ int namespace_query(const char *path, obj_handler_t *hd) return ret_inx; } - void namespace_loop(void) { rpc_loop(); diff --git a/mkrtos_user/server/init/src/namespace.h b/mkrtos_user/server/init/src/namespace.h index 81b613e20..acfc90451 100644 --- a/mkrtos_user/server/init/src/namespace.h +++ b/mkrtos_user/server/init/src/namespace.h @@ -23,4 +23,4 @@ int namespace_register(const char *path, obj_handler_t hd, int type); int namespace_query(const char *path, obj_handler_t *hd); int namespace_pre_alloc_map_fd(void); void namespace_loop(void); -void ns_node_del_by_pid(pid_t pid); +void ns_node_del_by_pid(pid_t pid, int to_del); diff --git a/mkrtos_user/server/init/src/pm.c b/mkrtos_user/server/init/src/pm.c index 6a61daa86..0e82f58d2 100644 --- a/mkrtos_user/server/init/src/pm.c +++ b/mkrtos_user/server/init/src/pm.c @@ -27,7 +27,7 @@ void pm_init(void) int pm_rpc_kill_task(int pid, int flags) { printf("[pm] kill pid:%d.\n", pid); - ns_node_del_by_pid(pid); + ns_node_del_by_pid(pid, flags); return 0; } int pm_rpc_run_app(const char *path, int flags)