修复启动应用时,hd_thread为释放问题
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user