This is an automated email from the ASF dual-hosted git repository.
gnutt pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git
The following commit(s) were added to refs/heads/master by this push:
new 50428979d0 fix wait after vfork return error
50428979d0 is described below
commit 50428979d0d1bb4c24c89bcc36a914158c56b373
Author: yangyalei <[email protected]>
AuthorDate: Tue Mar 7 21:36:22 2023 +0800
fix wait after vfork return error
Signed-off-by: yangyalei <[email protected]>
---
include/nuttx/sched.h | 4 +++-
libs/libc/unistd/lib_vfork.c | 6 ++++--
sched/sched/sched_waitpid.c | 16 ++++++++++------
3 files changed, 17 insertions(+), 9 deletions(-)
diff --git a/include/nuttx/sched.h b/include/nuttx/sched.h
index 47f2549ea2..aaaecc4a01 100644
--- a/include/nuttx/sched.h
+++ b/include/nuttx/sched.h
@@ -1457,6 +1457,7 @@ void nxsched_get_stateinfo(FAR struct tcb_s *tcb, FAR
char *state,
* pid - The task ID of the thread to waid for
* stat_loc - The location to return the exit status
* options - ignored
+ * release - Wheather release exited child process infomation
*
* Returned Value:
* If nxsched_waitpid() returns because the status of a child process is
@@ -1485,7 +1486,8 @@ void nxsched_get_stateinfo(FAR struct tcb_s *tcb, FAR
char *state,
****************************************************************************/
#ifdef CONFIG_SCHED_WAITPID
-pid_t nxsched_waitpid(pid_t pid, FAR int *stat_loc, int options);
+pid_t nxsched_waitpid(pid_t pid, FAR int *stat_loc, int options,
+ bool release);
#endif
/****************************************************************************
diff --git a/libs/libc/unistd/lib_vfork.c b/libs/libc/unistd/lib_vfork.c
index e23014d26c..15c21fdd8c 100644
--- a/libs/libc/unistd/lib_vfork.c
+++ b/libs/libc/unistd/lib_vfork.c
@@ -23,6 +23,7 @@
****************************************************************************/
#include <nuttx/config.h>
+#include <nuttx/sched.h>
#include <unistd.h>
#include <sys/wait.h>
@@ -63,10 +64,11 @@ pid_t vfork(void)
* until running finished or performing exec
*/
- ret = waitpid(pid, &status, 0);
+ ret = nxsched_waitpid(pid, &status, 0, false);
if (ret < 0)
{
- serr("ERROR: waitpid failed: %d\n", get_errno());
+ set_errno(-ret);
+ serr("ERROR: waitpid failed: %d\n", -ret);
}
}
diff --git a/sched/sched/sched_waitpid.c b/sched/sched/sched_waitpid.c
index ef535a62a8..069808f4e1 100644
--- a/sched/sched/sched_waitpid.c
+++ b/sched/sched/sched_waitpid.c
@@ -62,6 +62,7 @@
* pid - The task ID of the thread to waid for
* stat_loc - The location to return the exit status
* options - ignored
+ * release - Wheather release exited child process infomation
*
* Returned Value:
* If nxsched_waitpid() returns because the status of a child process is
@@ -90,7 +91,7 @@
****************************************************************************/
#ifndef CONFIG_SCHED_HAVE_PARENT
-pid_t nxsched_waitpid(pid_t pid, int *stat_loc, int options)
+pid_t nxsched_waitpid(pid_t pid, int *stat_loc, int options, bool release)
{
FAR struct tcb_s *ctcb;
FAR struct task_group_s *group;
@@ -221,7 +222,7 @@ errout:
****************************************************************************/
#else
-pid_t nxsched_waitpid(pid_t pid, int *stat_loc, int options)
+pid_t nxsched_waitpid(pid_t pid, int *stat_loc, int options, bool release)
{
FAR struct tcb_s *rtcb = this_task();
FAR struct tcb_s *ctcb;
@@ -388,8 +389,11 @@ pid_t nxsched_waitpid(pid_t pid, int *stat_loc, int
options)
/* Discard the child entry and break out of the loop */
- group_remove_child(rtcb->group, pid);
- group_free_child(child);
+ if (release)
+ {
+ group_remove_child(rtcb->group, pid);
+ group_free_child(child);
+ }
break;
}
}
@@ -475,7 +479,7 @@ pid_t nxsched_waitpid(pid_t pid, int *stat_loc, int options)
/* Discard the child entry, if we have one */
- if (child != NULL)
+ if (child != NULL && release)
{
group_remove_child(rtcb->group, child->ch_pid);
group_free_child(child);
@@ -636,7 +640,7 @@ pid_t waitpid(pid_t pid, int *stat_loc, int options)
/* Let nxsched_waitpid() do the work. */
- ret = nxsched_waitpid(pid, stat_loc, options);
+ ret = nxsched_waitpid(pid, stat_loc, options, true);
if (ret < 0)
{
set_errno(-ret);