修复启动应用时,hd_thread为释放问题

This commit is contained in:
zhangzheng
2023-12-17 00:01:34 +08:00
parent a8ea0aa043
commit ac9c4a9c26
6 changed files with 42 additions and 9 deletions

View File

@@ -13,9 +13,20 @@
#include "obj_space.h"
#include "kobject.h"
#include "assert.h"
#include "cpulock.h"
bool_t obj_map_root(kobject_t *kobj, obj_space_t *obj_space, ram_limit_t *ram, vpage_t page)
{
kobj_del_list_t kobj_list;
kobj_del_list_init(&kobj_list);
if (obj_space_lookup_kobj(obj_space, vpage_get_obj_handler(page)))
{ //!< 已经存在则解除注释
obj_unmap(obj_space, page, &kobj_list);
}
umword_t status = cpulock_lock();
kobj_del_list_to_do(&kobj_list);
cpulock_set(status);
obj_map_entry_t *map = obj_space_insert(obj_space, ram, kobj, vpage_get_obj_handler(page), vpage_get_attrs(page));
if (!map)

View File

@@ -6,7 +6,7 @@ export TOOLCHAIN=/Users/zhangzheng/gcc-arm-none-eabi-10.3-2021.10/bin/
export TOOLCHAIN_LIB=/Users/zhangzheng/gcc-arm-none-eabi-10.3-2021.10/lib/gcc/arm-none-eabi/10.3.1/thumb/v7-m/nofp
export KEN_OFFSET=0x2000
export INIT_OFFSET=0x10000
export BOOTFS_ADDR_OFFSET=0x21000
export BOOTFS_ADDR_OFFSET=0x22000
export KNL_DATA=0x20000000
export KNL_DATA_SIZE=10M
export BOARD=STM32F2x

View File

@@ -190,10 +190,11 @@ int app_load(const char *name, uenv_t *cur_env, pid_t *pid, char *argv[], int ar
tag = thread_exec_regs(hd_thread, (umword_t)addr, ((umword_t)((umword_t)sp_addr_top - 8) & ~0x7UL),
ram_base, 1);
assert(msg_tag_get_prot(tag) >= 0);
/*启动线程运行*/
tag = thread_run(hd_thread, 2);
assert(msg_tag_get_prot(tag) >= 0);
task_unmap(TASK_THIS, vpage_create_raw3(0, 0, hd_thread));
handler_free(hd_thread);
return 0;
end_del_obj:
if (hd_thread != HANDLER_INVALID)

View File

@@ -5,7 +5,7 @@
#include "u_task.h"
#include "u_hd_man.h"
#include <pthread.h>
#include <stdio.h>
#define HANDLER_START_INX 10 //!< fd开始的值前10个内核保留
#define HANDLER_MAX_NR 96 //!< 单个task最大支持的hd数量
@@ -59,6 +59,7 @@ bool_t handler_is_used(obj_handler_t hd_inx)
{
return 0;
}
umword_t word_offset = hd_inx / WORD_BITS;
umword_t bits_offset = hd_inx % WORD_BITS;
@@ -79,6 +80,7 @@ void handler_free(obj_handler_t hd_inx)
{
return;
}
umword_t word_offset = hd_inx / WORD_BITS;
umword_t bits_offset = hd_inx % WORD_BITS;

View File

@@ -54,7 +54,8 @@ static void _ns_node_del_by_pid(slist_head_t *head, pid_t pid, int to_del)
{
if (to_del)
{
task_unmap(TASK_THIS, vpage_create_raw3(KOBJ_DELETE_RIGHT, 0, pos->node_hd));
// task_unmap(TASK_THIS, vpage_create_raw3(KOBJ_DELETE_RIGHT, 0, pos->node_hd));
handler_del_umap(pos->node_hd);
}
}
}

View File

@@ -91,9 +91,7 @@ void pm_del_watch_by_pid(pm_t *pm, pid_t pid)
if (pos->src_pid == pid)
{
slist_del(&pos->node);
{
handler_free_umap(pos->sig_hd);
}
handler_free_umap(pos->sig_hd);
free(pos);
}
pos = next;
@@ -147,7 +145,9 @@ static bool_t pm_send_sig_to_task(pm_t *pm, pid_t pid, umword_t sig_val)
{
ipc_msg_t *ipc;
watch_entry_t *pos;
// slist_head_t del_head;
// slist_init(&del_head);
ipc = thread_get_cur_ipc_msg();
assert(ipc);
@@ -167,9 +167,27 @@ static bool_t pm_send_sig_to_task(pm_t *pm, pid_t pid, umword_t sig_val)
ipc_timeout_create2(0, 0));
}
slist_del(&pos->node);
handler_free_umap(pos->sig_hd);
handler_del_umap(pos->watch_pid);
free(pos);
// slist_add(&del_head, &pos->node);
}
pos = next;
}
// 观察者是否还在链表中
// 若果src_pid还在链表中不用删除因为它还是pm启动的
// slist_foreach_not_next(pos, &del_head, node)
// {
// watch_entry_t *next = slist_next_entry(pos, &del_head, node);
// if (!pm_watch_lookup(pm, pos->src_pid))
// {
// handler_free_umap(pos->src_pid);
// }
// slist_del(&pos->node);
// free(pos);
// pos = next;
// }
}
/**
* @brief 杀死某个进程
@@ -193,7 +211,7 @@ int pm_rpc_kill_task(int pid, int flags)
ns_node_del_by_pid(pid, flags); //!< 从ns中删除
pm_del_watch_by_pid(&pm, pid); //!< 从watch中删除
pm_send_sig_to_task(&pm, pid, KILL_SIG); //!< 给watch者发送sig
task_unmap(TASK_THIS, vpage_create_raw3(KOBJ_DELETE_RIGHT, 0, pid));
handler_del_umap(pid);
return 0;
}
/**