diff --git a/components/lwp/lwp_signal.c b/components/lwp/lwp_signal.c index 6b62f48bfa277370996239b72802b925ee7b13e8..95634906043fdaccc831066ee30819cf91cb3cc2 100644 --- a/components/lwp/lwp_signal.c +++ b/components/lwp/lwp_signal.c @@ -281,34 +281,25 @@ lwp_sighandler_t lwp_sighandler_get(int sig) rt_base_t level; if (sig == 0 || sig > _LWP_NSIG) + { return func; + } level = rt_hw_interrupt_disable(); thread = rt_thread_self(); - if (thread->signal_in_process) + lwp = (struct rt_lwp*)thread->lwp; + + func = lwp->signal_handler[sig - 1]; + if (!func) { - func = rt_thread_self()->signal_handler[sig - 1]; - if (!func) + if (_lwp_check_ignore(sig)) { - if (_lwp_check_ignore(sig)) - { - goto out; - } - sys_exit(0); + goto out; } - } - else - { - lwp = (struct rt_lwp*)thread->lwp; - func = lwp->signal_handler[sig - 1]; - if (!func) + if (lwp->signal_in_process) { - if (_lwp_check_ignore(sig)) - { - goto out; - } lwp_terminate(lwp); - sys_exit(0); } + sys_exit(0); } out: rt_hw_interrupt_enable(level); @@ -328,19 +319,6 @@ void lwp_sighandler_set(int sig, lwp_sighandler_t func) rt_hw_interrupt_enable(level); } -void lwp_thread_sighandler_set(int sig, lwp_sighandler_t func) -{ - rt_base_t level; - - if (sig == 0 || sig > _LWP_NSIG) - return; - if (sig == SIGKILL || sig == SIGSTOP) - return; - level = rt_hw_interrupt_disable(); - rt_thread_self()->signal_handler[sig - 1] = func; - rt_hw_interrupt_enable(level); -} - int lwp_sigaction(int sig, const struct lwp_sigaction *act, struct lwp_sigaction *oact, size_t sigsetsize) { diff --git a/components/lwp/lwp_signal.h b/components/lwp/lwp_signal.h index 27e24adbf3a5016de9a44f29875a001079339e32..310e437886fc08c081487d092ae325f3d31b49b7 100644 --- a/components/lwp/lwp_signal.h +++ b/components/lwp/lwp_signal.h @@ -23,7 +23,6 @@ struct rt_user_context *lwp_signal_restore(void); lwp_sighandler_t lwp_sighandler_get(int sig); void lwp_sighandler_set(int sig, lwp_sighandler_t func); int lwp_sigprocmask(int how, const lwp_sigset_t *sigset, lwp_sigset_t *oset); -void lwp_thread_sighandler_set(int sig, lwp_sighandler_t func); int lwp_sigaction(int sig, const struct lwp_sigaction *act, struct lwp_sigaction * oact, size_t sigsetsize); int lwp_thread_sigprocmask(int how, const lwp_sigset_t *sigset, lwp_sigset_t *oset); diff --git a/components/lwp/lwp_syscall.c b/components/lwp/lwp_syscall.c index 2f361448d8f630093a9db27ce42dd7ddcab54206..bac6291fcad3fad5cf925e64dde8cfd195750395 100644 --- a/components/lwp/lwp_syscall.c +++ b/components/lwp/lwp_syscall.c @@ -2030,14 +2030,18 @@ int sys_sigprocmask(int how, const sigset_t *sigset, sigset_t *oset, size_t size return ret; } -int sys_thread_kill(rt_thread_t thread, int sig) -{ - return lwp_thread_kill(thread, sig); -} -void sys_thread_sighandler_set(int sig, lwp_sighandler_t func) +int sys_tkill(int tid, int sig) { - lwp_thread_sighandler_set(sig, func); + rt_thread_t thread = RT_NULL; + + if (tid <= 0) + { + rt_set_errno(EINVAL); + return -RT_EINVAL; + } + thread = lwp_tid_get_thread(tid); + return lwp_thread_kill(thread, sig); } int sys_thread_sigprocmask(int how, const lwp_sigset_t *sigset, lwp_sigset_t *oset, size_t size) @@ -2636,8 +2640,8 @@ const static void* func_table[] = (void *)sys_thread_mdelay, (void *)sys_sigaction, (void *)sys_sigprocmask, - (void *)sys_thread_kill, /* 105 */ - (void *)sys_thread_sighandler_set, + (void *)sys_tkill, /* 105 */ + (void *)sys_notimpl, (void *)sys_thread_sigprocmask, (void *)sys_notimpl, (void *)sys_notimpl, diff --git a/components/lwp/lwp_tid.c b/components/lwp/lwp_tid.c index 082c5dca3fb6d4024e4f027768388484c773dcf4..daecb5ea1e32f1a52a873115214c1824f096a2f9 100644 --- a/components/lwp/lwp_tid.c +++ b/components/lwp/lwp_tid.c @@ -27,7 +27,7 @@ #define DBG_LVL DBG_INFO #include -static rt_thread_t lwp_tid_ary[LWP_TID_MAX_NR + 1]; +static rt_thread_t lwp_tid_ary[LWP_TID_MAX_NR]; static rt_thread_t *lwp_tid_free_head = RT_NULL; static int lwp_tid_ary_alloced = 1; /* 0 is reserved */ @@ -75,7 +75,13 @@ rt_thread_t lwp_tid_get_thread(int tid) if (tid > 0 && tid < LWP_TID_MAX_NR) { - thread = lwp_tid_free_head[tid]; + thread = lwp_tid_ary[tid]; + if ((thread >= (rt_thread_t)lwp_tid_ary) + && (thread < (rt_thread_t)(lwp_tid_ary + LWP_TID_MAX_NR + 1))) + { + /* the tid is not used */ + thread = RT_NULL; + } } return thread; } diff --git a/include/rtdef.h b/include/rtdef.h index c7424b9700035303c97912ec76cc679821bf37ae..08839aa85c48e6f5c54b88075c5f5258c7f336d2 100644 --- a/include/rtdef.h +++ b/include/rtdef.h @@ -731,7 +731,6 @@ struct rt_thread lwp_sigset_t signal_mask; int signal_mask_bak; rt_uint32_t signal_in_process; - lwp_sighandler_t signal_handler[_LWP_NSIG]; struct rt_user_context user_ctx; struct rt_wakeup wakeup; /**< wakeup data */ diff --git a/src/thread.c b/src/thread.c index 863bf6259a3dee7bd323e399aa0c943da9661270..50214ea098ae197464f2b3b777defb094054600e 100644 --- a/src/thread.c +++ b/src/thread.c @@ -210,7 +210,6 @@ static rt_err_t _rt_thread_init(struct rt_thread *thread, rt_memset(&thread->signal_mask, 0, sizeof(lwp_sigset_t)); thread->signal_mask_bak = 0; thread->signal_in_process = 0; - rt_memset(thread->signal_handler, 0, sizeof thread->signal_handler); rt_memset(&thread->user_ctx, 0, sizeof thread->user_ctx); #endif