sched: remove the unused function nx_wait and nx_waitid

This partially reverts commit de2a9d8a77.
This commit is contained in:
Xiang Xiao
2022-10-28 02:07:27 +08:00
committed by Petro Karashchenko
parent 579e47347e
commit 5bee68ebac
3 changed files with 92 additions and 108 deletions
-2
View File
@@ -1374,8 +1374,6 @@ int nxsched_get_stackinfo(pid_t pid, FAR struct stackinfo_s *stackinfo);
****************************************************************************/ ****************************************************************************/
#ifdef CONFIG_SCHED_WAITPID #ifdef CONFIG_SCHED_WAITPID
pid_t nx_wait(FAR int *stat_loc);
int nx_waitid(int idtype, id_t id, FAR siginfo_t *info, int options);
pid_t nx_waitpid(pid_t pid, FAR int *stat_loc, int options); pid_t nx_waitpid(pid_t pid, FAR int *stat_loc, int options);
#endif #endif
-9
View File
@@ -38,15 +38,6 @@
* Public Functions * Public Functions
****************************************************************************/ ****************************************************************************/
/****************************************************************************
* Name: nx_wait
****************************************************************************/
pid_t nx_wait(FAR int *stat_loc)
{
return nx_waitpid(INVALID_PROCESS_ID, stat_loc, 0);
}
/**************************************************************************** /****************************************************************************
* Name: wait * Name: wait
* *
+92 -97
View File
@@ -82,10 +82,69 @@ static void exited_child(FAR struct tcb_s *rtcb,
****************************************************************************/ ****************************************************************************/
/**************************************************************************** /****************************************************************************
* Name: nx_waitid * Name: waitid
*
* Description:
* The waitid() function suspends the calling thread until one child of
* the process containing the calling thread changes state. It records the
* current state of a child in the structure pointed to by 'info'. If a
* child process changed state prior to the call to waitid(), waitid()
* returns immediately. If more than one thread is suspended in wait() or
* waitpid() waiting termination of the same process, exactly one thread
* will return the process status at the time of the target process
* termination
*
* The idtype and id arguments are used to specify which children waitid()
* will wait for.
*
* If idtype is P_PID, waitid() will wait for the child with a process
* ID equal to (pid_t)id.
*
* If idtype is P_PGID, waitid() will wait for any child with a process
* group ID equal to (pid_t)id.
*
* If idtype is P_ALL, waitid() will wait for any children and id is
* ignored.
*
* The options argument is used to specify which state changes waitid()
* will will wait for. It is formed by OR-ing together one or more of the
* following flags:
*
* WEXITED - Wait for processes that have exited.
* WSTOPPED - Status will be returned for any child that has stopped
* upon receipt of a signal.
* WCONTINUED - Status will be returned for any child that was stopped
* and has been continued.
* WNOHANG - Return immediately if there are no children to wait for.
* WNOWAIT - Keep the process whose status is returned in 'info' in a
* waitable state. This will not affect the state of the process; the
* process may be waited for again after this call completes.
*
* The 'info' argument must point to a siginfo_t structure. If waitid()
* returns because a child process was found that satisfied the conditions
* indicated by the arguments idtype and options, then the structure
* pointed to by 'info' will be filled in by the system with the status of
* the process. The si_signo member will always be equal to SIGCHLD.
*
* Input Parameters:
* See description.
*
* Returned Value:
* If waitid() returns due to the change of state of one of its children,
* 0 is returned. Otherwise, -1 is returned and errno is set to indicate
* the error.
*
* The waitid() function will fail if:
*
* ECHILD - The calling process has no existing unwaited-for child
* processes.
* EINTR - The waitid() function was interrupted by a signal.
* EINVAL - An invalid value was specified for options, or idtype and id
* specify an invalid set of processes.
*
****************************************************************************/ ****************************************************************************/
int nx_waitid(int idtype, id_t id, FAR siginfo_t *info, int options) int waitid(idtype_t idtype, id_t id, FAR siginfo_t *info, int options)
{ {
FAR struct tcb_s *rtcb = this_task(); FAR struct tcb_s *rtcb = this_task();
FAR struct tcb_s *ctcb; FAR struct tcb_s *ctcb;
@@ -94,7 +153,8 @@ int nx_waitid(int idtype, id_t id, FAR siginfo_t *info, int options)
bool retains; bool retains;
#endif #endif
sigset_t set; sigset_t set;
int ret = OK; int errcode;
int ret;
/* MISSING LOGIC: If WNOHANG is provided in the options, then this /* MISSING LOGIC: If WNOHANG is provided in the options, then this
* function should returned immediately. However, there is no mechanism * function should returned immediately. However, there is no mechanism
@@ -108,7 +168,8 @@ int nx_waitid(int idtype, id_t id, FAR siginfo_t *info, int options)
if (idtype != P_PID && idtype != P_ALL) if (idtype != P_PID && idtype != P_ALL)
{ {
return -ENOSYS; set_errno(ENOSYS);
return ERROR;
} }
/* None of the options are supported except for WEXITED (which must be /* None of the options are supported except for WEXITED (which must be
@@ -118,15 +179,21 @@ int nx_waitid(int idtype, id_t id, FAR siginfo_t *info, int options)
if ((options & WEXITED) == 0) if ((options & WEXITED) == 0)
{ {
return -ENOSYS; set_errno(ENOSYS);
return ERROR;
} }
if ((options & ~(WEXITED | WNOHANG)) != 0) if ((options & ~(WEXITED | WNOHANG)) != 0)
{ {
return -ENOSYS; set_errno(ENOSYS);
return ERROR;
} }
#endif #endif
/* waitid() is a cancellation point */
enter_cancellation_point();
/* Create a signal set that contains only SIGCHLD */ /* Create a signal set that contains only SIGCHLD */
sigemptyset(&set); sigemptyset(&set);
@@ -157,7 +224,7 @@ int nx_waitid(int idtype, id_t id, FAR siginfo_t *info, int options)
{ {
/* There are no children */ /* There are no children */
ret = -ECHILD; errcode = ECHILD;
goto errout; goto errout;
} }
else if (idtype == P_PID) else if (idtype == P_PID)
@@ -173,7 +240,7 @@ int nx_waitid(int idtype, id_t id, FAR siginfo_t *info, int options)
if (ctcb->group->tg_ppid != rtcb->pid) if (ctcb->group->tg_ppid != rtcb->pid)
{ {
ret = -ECHILD; errcode = ECHILD;
goto errout; goto errout;
} }
} }
@@ -188,7 +255,7 @@ int nx_waitid(int idtype, id_t id, FAR siginfo_t *info, int options)
{ {
/* This specific pid is not a child */ /* This specific pid is not a child */
ret = -ECHILD; errcode = ECHILD;
goto errout; goto errout;
} }
} }
@@ -200,7 +267,7 @@ int nx_waitid(int idtype, id_t id, FAR siginfo_t *info, int options)
{ {
/* There are no children */ /* There are no children */
ret = -ECHILD; errcode = ECHILD;
goto errout; goto errout;
} }
else if (idtype == P_PID) else if (idtype == P_PID)
@@ -213,7 +280,7 @@ int nx_waitid(int idtype, id_t id, FAR siginfo_t *info, int options)
if (!ctcb || !ctcb->group || ctcb->group->tg_ppid != rtcb->pid) if (!ctcb || !ctcb->group || ctcb->group->tg_ppid != rtcb->pid)
{ {
ret = -ECHILD; errcode = ECHILD;
goto errout; goto errout;
} }
} }
@@ -285,7 +352,7 @@ int nx_waitid(int idtype, id_t id, FAR siginfo_t *info, int options)
* to reported ECHILD than bogus status. * to reported ECHILD than bogus status.
*/ */
ret = -ECHILD; errcode = ECHILD;
goto errout; goto errout;
} }
} }
@@ -304,7 +371,7 @@ int nx_waitid(int idtype, id_t id, FAR siginfo_t *info, int options)
* Let's return ECHILD.. that is at least informative. * Let's return ECHILD.. that is at least informative.
*/ */
ret = -ECHILD; errcode = ECHILD;
goto errout; goto errout;
} }
#endif #endif
@@ -330,6 +397,7 @@ int nx_waitid(int idtype, id_t id, FAR siginfo_t *info, int options)
ret = nxsig_waitinfo(&set, info); ret = nxsig_waitinfo(&set, info);
if (ret < 0) if (ret < 0)
{ {
errcode = -ret;
goto errout; goto errout;
} }
@@ -390,102 +458,29 @@ int nx_waitid(int idtype, id_t id, FAR siginfo_t *info, int options)
else /* if (idtype == P_PGID) */ else /* if (idtype == P_PGID) */
{ {
ret = -ENOSYS; errcode = ENOSYS;
goto errout; goto errout;
} }
} }
} }
#ifdef CONFIG_SMP
leave_critical_section(flags);
#else
sched_unlock();
#endif
leave_cancellation_point();
return OK;
errout: errout:
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
leave_critical_section(flags); leave_critical_section(flags);
#else #else
sched_unlock(); sched_unlock();
#endif #endif
return ret;
}
/****************************************************************************
* Name: waitid
*
* Description:
* The waitid() function suspends the calling thread until one child of
* the process containing the calling thread changes state. It records the
* current state of a child in the structure pointed to by 'info'. If a
* child process changed state prior to the call to waitid(), waitid()
* returns immediately. If more than one thread is suspended in wait() or
* waitpid() waiting termination of the same process, exactly one thread
* will return the process status at the time of the target process
* termination
*
* The idtype and id arguments are used to specify which children waitid()
* will wait for.
*
* If idtype is P_PID, waitid() will wait for the child with a process
* ID equal to (pid_t)id.
*
* If idtype is P_PGID, waitid() will wait for any child with a process
* group ID equal to (pid_t)id.
*
* If idtype is P_ALL, waitid() will wait for any children and id is
* ignored.
*
* The options argument is used to specify which state changes waitid()
* will will wait for. It is formed by OR-ing together one or more of the
* following flags:
*
* WEXITED - Wait for processes that have exited.
* WSTOPPED - Status will be returned for any child that has stopped
* upon receipt of a signal.
* WCONTINUED - Status will be returned for any child that was stopped
* and has been continued.
* WNOHANG - Return immediately if there are no children to wait for.
* WNOWAIT - Keep the process whose status is returned in 'info' in a
* waitable state. This will not affect the state of the process; the
* process may be waited for again after this call completes.
*
* The 'info' argument must point to a siginfo_t structure. If waitid()
* returns because a child process was found that satisfied the conditions
* indicated by the arguments idtype and options, then the structure
* pointed to by 'info' will be filled in by the system with the status of
* the process. The si_signo member will always be equal to SIGCHLD.
*
* Input Parameters:
* See description.
*
* Returned Value:
* If waitid() returns due to the change of state of one of its children,
* 0 is returned. Otherwise, -1 is returned and errno is set to indicate
* the error.
*
* The waitid() function will fail if:
*
* ECHILD - The calling process has no existing unwaited-for child
* processes.
* EINTR - The waitid() function was interrupted by a signal.
* EINVAL - An invalid value was specified for options, or idtype and id
* specify an invalid set of processes.
*
****************************************************************************/
int waitid(idtype_t idtype, id_t id, FAR siginfo_t *info, int options)
{
int ret;
/* waitid() is a cancellation point */
enter_cancellation_point();
ret = nx_waitid(idtype, id, info, options);
if (ret < 0)
{
set_errno(-ret);
ret = ERROR;
}
leave_cancellation_point(); leave_cancellation_point();
return ret; set_errno(errcode);
return ERROR;
} }
#endif /* CONFIG_SCHED_WAITPID && CONFIG_SCHED_HAVE_PARENT */ #endif /* CONFIG_SCHED_WAITPID && CONFIG_SCHED_HAVE_PARENT */