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

!123 增加tkill系统调用
Merge pull request !123 from jesven/tkill

bernard 5 лет назад
Родитель
Сommit
fea6a1eb5e
6 измененных файлов с 30 добавлено и 45 удалено
  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. 8 2
      components/lwp/lwp_tid.c
  5. 0 1
      include/rtdef.h
  6. 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,

+ 8 - 2
components/lwp/lwp_tid.c

@@ -27,7 +27,7 @@
 #define DBG_LVL    DBG_INFO
 #include <rtdbg.h>
 
-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;
 }

+ 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