[component/lwp] support more feature of signal from IEEE Std 1003.1-2017 (#7828)

Signed-off-by: Shell <smokewood@qq.com>
This commit is contained in:
Shell
2023-07-20 00:02:41 +08:00
committed by GitHub
parent c732cc0083
commit 58e0ddf287
25 changed files with 2052 additions and 826 deletions

View File

@@ -22,6 +22,7 @@
#include "lwp.h"
#include "lwp_pid.h"
#include "lwp_signal.h"
#include "tty.h"
#ifdef ARCH_MM_MMU
@@ -319,7 +320,7 @@ struct rt_lwp* lwp_new(void)
{
return lwp;
}
rt_memset(lwp, 0, sizeof(*lwp));
memset(lwp, 0, sizeof(*lwp));
//lwp->tgroup_leader = RT_NULL;
rt_list_init(&lwp->wait_list);
lwp->leader = 0;
@@ -331,6 +332,8 @@ struct rt_lwp* lwp_new(void)
rt_wqueue_init(&lwp->wait_queue);
lwp->ref = 1;
lwp_signal_init(&lwp->signal);
level = rt_hw_interrupt_disable();
pid = lwp_pid_get();
if (pid == 0)
@@ -475,34 +478,33 @@ void lwp_free(struct rt_lwp* lwp)
}
/* for parent */
if (lwp->parent)
{
if (lwp->parent)
struct rt_thread *thread;
if (!rt_list_isempty(&lwp->wait_list))
{
struct rt_thread *thread;
if (!rt_list_isempty(&lwp->wait_list))
{
thread = rt_list_entry(lwp->wait_list.next, struct rt_thread, tlist);
thread->error = RT_EOK;
thread->msg_ret = (void*)(rt_size_t)lwp->lwp_ret;
rt_thread_resume(thread);
rt_hw_interrupt_enable(level);
return;
}
else
{
struct rt_lwp **it = &lwp->parent->first_child;
while (*it != lwp)
{
it = &(*it)->sibling;
}
*it = lwp->sibling;
}
thread = rt_list_entry(lwp->wait_list.next, struct rt_thread, tlist);
thread->error = RT_EOK;
thread->msg_ret = (void*)(rt_size_t)lwp->lwp_ret;
rt_thread_resume(thread);
rt_hw_interrupt_enable(level);
return;
}
else
{
struct rt_lwp **it = &lwp->parent->first_child;
while (*it != lwp)
{
it = &(*it)->sibling;
}
*it = lwp->sibling;
}
lwp_pid_put(lwp_to_pid(lwp));
rt_hw_interrupt_enable(level);
rt_free(lwp);
}
lwp_pid_put(lwp_to_pid(lwp));
rt_hw_interrupt_enable(level);
rt_free(lwp);
}
int lwp_ref_inc(struct rt_lwp *lwp)
@@ -537,6 +539,7 @@ int lwp_ref_dec(struct rt_lwp *lwp)
memset(&msg, 0, sizeof msg);
rt_raw_channel_send(gdb_server_channel(), &msg);
}
lwp_signal_detach(&lwp->signal);
#ifndef ARCH_MM_MMU
#ifdef RT_LWP_USING_SHM
@@ -846,7 +849,7 @@ static void cmd_kill(int argc, char** argv)
sig = atoi(argv[3]);
}
}
lwp_kill(pid, sig);
lwp_signal_kill(lwp_from_pid(pid), sig, SI_USER, 0);
}
MSH_CMD_EXPORT_ALIAS(cmd_kill, kill, send a signal to a process);
@@ -861,7 +864,7 @@ static void cmd_killall(int argc, char** argv)
while((pid = lwp_name2pid(argv[1])) > 0)
{
lwp_kill(pid, SIGKILL);
lwp_signal_kill(lwp_from_pid(pid), SIGKILL, SI_USER, 0);
rt_thread_mdelay(100);
}
}
@@ -979,6 +982,11 @@ void lwp_terminate(struct rt_lwp *lwp)
}
level = rt_hw_interrupt_disable();
/* stop the receiving of signals */
lwp->terminated = RT_TRUE;
/* broadcast exit request for sibling threads */
for (list = lwp->t_grp.next; list != &lwp->t_grp; list = list->next)
{
rt_thread_t thread;