From b8e332fa2d22ebf47ad2cbe1d744b7327289e0ea Mon Sep 17 00:00:00 2001 From: Shell Date: Sat, 9 Sep 2023 09:35:33 +0800 Subject: [PATCH] [smart] add waitpid(-1) support (#8020) Signed-off-by: shell --- components/lwp/lwp_pid.c | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/components/lwp/lwp_pid.c b/components/lwp/lwp_pid.c index 38d068ee0a..7c00174762 100644 --- a/components/lwp/lwp_pid.c +++ b/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; + + this_lwp = lwp_self(); + if (!this_lwp) + { + goto quit; + } level = rt_hw_interrupt_disable(); - lwp = lwp_from_pid(pid); - if (!lwp) + if (pid == -1) { - goto quit; + lwp = this_lwp->first_child; + if (!lwp) + goto quit; + else + pid = lwp->pid; + } + else + { + lwp = lwp_from_pid(pid); + if (!lwp) + { + goto quit; + } } - lwp_self = (struct rt_lwp *)rt_thread_self()->lwp; - if (!lwp_self) - { - goto quit; - } - if (lwp->parent != lwp_self) + 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);