Răsfoiți Sursa

修正kill的行为及增加设置错误码

shaojinchun 4 ani în urmă
părinte
comite
61d59a1bf5
2 a modificat fișierele cu 34 adăugiri și 25 ștergeri
  1. 27 18
      components/lwp/lwp_signal.c
  2. 7 7
      components/lwp/lwp_syscall.c

+ 27 - 18
components/lwp/lwp_signal.c

@@ -516,27 +516,31 @@ int lwp_kill(pid_t pid, int sig)
 {
     rt_base_t level;
     struct rt_lwp *lwp;
-    int ret = -RT_EINVAL;
+    int ret = -1;
     rt_thread_t thread;
 
-    if (sig == 0 || sig > _LWP_NSIG)
+    if (sig < 0 || sig >= _LWP_NSIG)
+    {
+        rt_set_errno(EINVAL);
         return ret;
+    }
     level = rt_hw_interrupt_disable();
     lwp = lwp_from_pid(pid);
     if (!lwp)
     {
+        rt_set_errno(ESRCH);
         goto out;
     }
-
-    /* check main thread */
-    thread = rt_list_entry(lwp->t_grp.prev, struct rt_thread, sibling);
-    if (lwp_sigismember(&lwp->signal_mask, sig)) /* if signal masked */
+    if (sig)
     {
-        goto out;
+        /* check main thread */
+        thread = rt_list_entry(lwp->t_grp.prev, struct rt_thread, sibling);
+        if (!lwp_sigismember(&lwp->signal_mask, sig)) /* if signal masked */
+        {
+            lwp_sigaddset(&lwp->signal, sig);
+            _do_signal_wakeup(thread, sig);
+        }
     }
-
-    lwp_sigaddset(&lwp->signal, sig);
-    _do_signal_wakeup(thread, sig);
     ret = 0;
 out:
     rt_hw_interrupt_enable(level);
@@ -548,22 +552,27 @@ int lwp_thread_kill(rt_thread_t thread, int sig)
     rt_base_t level;
     int ret = -RT_EINVAL;
 
-    if (!thread) return ret;
-
-    if (sig == 0 || sig > _LWP_NSIG)
+    if (!thread)
+    {
+        rt_set_errno(ESRCH);
         return ret;
+    }
+    if (sig < 0 || sig >= _LWP_NSIG)
+    {
+        rt_set_errno(EINVAL);
+        return ret;
+    }
     level = rt_hw_interrupt_disable();
     if (!thread->lwp)
     {
+        rt_set_errno(EPERM);
         goto out;
     }
-    if (lwp_sigismember(&thread->signal_mask, sig)) /* if signal masked */
+    if (!lwp_sigismember(&thread->signal_mask, sig)) /* if signal masked */
     {
-        goto out;
+        lwp_sigaddset(&thread->signal, sig);
+        _do_signal_wakeup(thread, sig);
     }
-
-    lwp_sigaddset(&thread->signal, sig);
-    _do_signal_wakeup(thread, sig);
     ret = 0;
 out:
     rt_hw_interrupt_enable(level);

+ 7 - 7
components/lwp/lwp_syscall.c

@@ -2770,15 +2770,15 @@ int sys_sigprocmask(int how, const sigset_t *sigset, sigset_t *oset, size_t size
 
 int sys_tkill(int tid, int sig)
 {
-    rt_thread_t thread = RT_NULL;
+    rt_base_t level;
+    rt_thread_t thread;
+    int ret;
 
-    if (tid <= 0)
-    {
-        rt_set_errno(EINVAL);
-        return -RT_EINVAL;
-    }
+    level = rt_hw_interrupt_disable();
     thread = lwp_tid_get_thread(tid);
-    return lwp_thread_kill(thread, sig);
+    ret =  lwp_thread_kill(thread, sig);
+    rt_hw_interrupt_enable(level);
+    return ret;
 }
 
 int sys_thread_sigprocmask(int how, const lwp_sigset_t *sigset, lwp_sigset_t *oset, size_t size)