Просмотр исходного кода

实现tkill系统调用以增加对pthead_cancel的支持

shaojinchun 5 лет назад
Родитель
Сommit
627cad97e4
5 измененных файлов с 22 добавлено и 43 удалено
  1. 10 32
      components/lwp/lwp_signal.c
  2. 0 1
      components/lwp/lwp_signal.h
  3. 12 8
      components/lwp/lwp_syscall.c
  4. 0 1
      include/rtdef.h
  5. 0 1
      src/thread.c

+ 10 - 32
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)
 {

+ 0 - 1
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);
 

+ 12 - 8
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,

+ 0 - 1
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 */

+ 0 - 1
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