Browse Source

[smart] add waitpid(-1) support (#8020)

Signed-off-by: shell <wangxiaoyao@rt-thread.com>
Shell 1 year ago
parent
commit
b8e332fa2d
1 changed files with 21 additions and 9 deletions
  1. 21 9
      components/lwp/lwp_pid.c

+ 21 - 9
components/lwp/lwp_pid.c

@@ -648,21 +648,33 @@ pid_t waitpid(pid_t pid, int *status, int options)
     rt_base_t level;
     struct rt_thread *thread;
     struct rt_lwp *lwp;
-    struct rt_lwp *lwp_self;
+    struct rt_lwp *this_lwp;
 
-    level = rt_hw_interrupt_disable();
-    lwp = lwp_from_pid(pid);
-    if (!lwp)
+    this_lwp = lwp_self();
+    if (!this_lwp)
     {
         goto quit;
     }
 
-    lwp_self = (struct rt_lwp *)rt_thread_self()->lwp;
-    if (!lwp_self)
+    level = rt_hw_interrupt_disable();
+    if (pid == -1)
     {
-        goto quit;
+        lwp = this_lwp->first_child;
+        if (!lwp)
+            goto quit;
+        else
+            pid = lwp->pid;
     }
-    if (lwp->parent != lwp_self)
+    else
+    {
+        lwp = lwp_from_pid(pid);
+        if (!lwp)
+        {
+            goto quit;
+        }
+    }
+
+    if (lwp->parent != this_lwp)
     {
         goto quit;
     }
@@ -693,7 +705,7 @@ pid_t waitpid(pid_t pid, int *status, int options)
         struct rt_lwp **lwp_node;
 
         *status = lwp->lwp_ret;
-        lwp_node = &lwp_self->first_child;
+        lwp_node = &this_lwp->first_child;
         while (*lwp_node != lwp)
         {
             RT_ASSERT(*lwp_node != RT_NULL);