summaryrefslogtreecommitdiff
path: root/apps/nshlib/nsh_builtin.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/nshlib/nsh_builtin.c')
-rw-r--r--apps/nshlib/nsh_builtin.c26
1 files changed, 17 insertions, 9 deletions
diff --git a/apps/nshlib/nsh_builtin.c b/apps/nshlib/nsh_builtin.c
index 343a0824b..0d5a0231c 100644
--- a/apps/nshlib/nsh_builtin.c
+++ b/apps/nshlib/nsh_builtin.c
@@ -131,12 +131,14 @@ int nsh_builtin(FAR struct nsh_vtbl_s *vtbl, FAR const char *cmd,
{
/* The application was successfully started with pre-emption disabled.
* In the simplest cases, the application will not have run because the
- * the scheduler is locked. but in the case were I/O redirected, a
- * proxy task ran and, as result, so may have the application.
+ * the scheduler is locked. But in the case where I/O was redirected, a
+ * proxy task ran and broke our lock. As result, the application may
+ * have aso ran if its priority was higher than than the priority of
+ * this thread.
*
- * If the application did not run and if the application was not
- * backgrounded, then we need to wait here for the application to
- * exit. This only works works with the following options:
+ * If the application did not run to completion and if the application
+ * was not backgrounded, then we need to wait here for the application
+ * to exit. This only works works with the following options:
*
* - CONFIG_NSH_DISABLEBG - Do not run commands in background
* - CONFIG_SCHED_WAITPID - Required to run external commands in
@@ -156,11 +158,17 @@ int nsh_builtin(FAR struct nsh_vtbl_s *vtbl, FAR const char *cmd,
{
int rc = 0;
- /* Wait for the application to exit. We did locked the scheduler
+ /* Wait for the application to exit. We did lock the scheduler
* above, but that does not guarantee that the application did not
- * run in the case where I/O was redirected. The scheduler will
- * be unlocked while waitpid is waiting and if the application has
- * not yet run, it will be able to to do so.
+ * already run to completion in the case where I/O was redirected.
+ * Here the scheduler will be unlocked while waitpid is waiting
+ * and if the application has not yet run, it will now be able to
+ * do so.
+ *
+ * Also, if CONFIG_SCHED_HAVE_PARENT is defined waitpid() might fail
+ * even if task is still active: If the I/O was re-directed by a
+ * proxy task, then the ask is a child of the proxy, and not this
+ * task. waitpid() fails with ECHILD in either case.
*/
ret = waitpid(ret, &rc, 0);