You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by gn...@apache.org on 2020/02/20 14:53:55 UTC
[incubator-nuttx] branch pr333 updated: binfmt/exec: make the spawn
attribute take effect
This is an automated email from the ASF dual-hosted git repository.
gnutt pushed a commit to branch pr333
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git
The following commit(s) were added to refs/heads/pr333 by this push:
new d8caf65 binfmt/exec: make the spawn attribute take effect
d8caf65 is described below
commit d8caf6593428a4d6e98703c4b96b7457dc07365d
Author: chao.an <an...@xiaomi.com>
AuthorDate: Thu Feb 20 20:16:32 2020 +0800
binfmt/exec: make the spawn attribute take effect
Change-Id: I834a62c122eb2f59ebea99326d23ec75b9671dca
Signed-off-by: chao.an <an...@xiaomi.com>
---
binfmt/binfmt_exec.c | 127 +++++++++++++++++++++++++++++-------------
include/nuttx/binfmt/binfmt.h | 35 ++++++++++++
sched/task/task_posixspawn.c | 2 +-
3 files changed, 125 insertions(+), 39 deletions(-)
diff --git a/binfmt/binfmt_exec.c b/binfmt/binfmt_exec.c
index 7855f6e..b280a26 100644
--- a/binfmt/binfmt_exec.c
+++ b/binfmt/binfmt_exec.c
@@ -57,44 +57,11 @@
****************************************************************************/
/****************************************************************************
- * Name: exec
+ * Name: exec_spawn
*
* Description:
- * This is a convenience function that wraps load_ and exec_module into
- * one call. If CONFIG_BINFMT_LOADABLE is defined, this function will
- * schedule to unload the module when task exits.
- *
- * This non-standard, NuttX function is similar to execv() and
- * posix_spawn() but differs in the following ways;
- *
- * - Unlike execv() and posix_spawn() this function accepts symbol table
- * information as input parameters. This means that the symbol table
- * used to link the application prior to execution is provided by the
- * caller, not by the system.
- * - Unlike execv(), this function always returns.
- *
- * This non-standard interface is included as a official NuttX API only
- * because it is needed in certain build modes: exec() is probably the
- * only way to load programs in the PROTECTED mode. Other file execution
- * APIs rely on a symbol table provided by the OS. In the PROTECTED build
- * mode, the OS cannot provide any meaningful symbolic information for
- * execution of code in the user-space blob so that is the exec() function
- * is really needed in that build case
- *
- * The interface is available in the FLAT build mode although it is not
- * really necessary in that case. It is currently used by some example
- * code under the apps/ that that generate their own symbol tables for
- * linking test programs. So although it is not necessary, it can still
- * be useful.
- *
- * The interface would be completely useless and will not be supported in
- * in the KERNEL build mode where the contrary is true: An application
- * process cannot provide any meaningful symbolic information for use in
- * linking a different process.
- *
- * NOTE: This function is flawed and useless without CONFIG_BINFMT_LOADABLE
- * because without that features there is then no mechanism to unload the
- * module once it exits.
+ * exec() configurable version, delivery the spawn attribute if this
+ * process has special customization.
*
* Input Parameters:
* filename - The path to the program to be executed. If
@@ -109,6 +76,7 @@
* exported by the caller and made available for linking the
* module into the system.
* nexports - The number of symbols in the exports table.
+ * attr - The spawn attributes.
*
* Returned Value:
* This is an end-user function, so it follows the normal convention:
@@ -117,8 +85,9 @@
*
****************************************************************************/
-int exec(FAR const char *filename, FAR char * const *argv,
- FAR const struct symtab_s *exports, int nexports)
+int exec_spawn(FAR const char *filename, FAR char * const *argv,
+ FAR const struct symtab_s *exports, int nexports,
+ FAR const posix_spawnattr_t *attr)
{
FAR struct binary_s *bin;
int pid;
@@ -161,6 +130,21 @@ int exec(FAR const char *filename, FAR char * const *argv,
goto errout_with_argv;
}
+ /* Update the spawn attribute */
+
+ if (attr)
+ {
+ if (attr->priority > 0)
+ {
+ bin->priority = attr->priority;
+ }
+
+ if (attr->stacksize > 0)
+ {
+ bin->stacksize = attr->stacksize;
+ }
+ }
+
/* Disable pre-emption so that the executed module does
* not return until we get a chance to connect the on_exit
* handler.
@@ -215,4 +199,71 @@ errout:
return ERROR;
}
+/****************************************************************************
+ * Name: exec
+ *
+ * Description:
+ * This is a convenience function that wraps load_ and exec_module into
+ * one call. If CONFIG_BINFMT_LOADABLE is defined, this function will
+ * schedule to unload the module when task exits.
+ *
+ * This non-standard, NuttX function is similar to execv() and
+ * posix_spawn() but differs in the following ways;
+ *
+ * - Unlike execv() and posix_spawn() this function accepts symbol table
+ * information as input parameters. This means that the symbol table
+ * used to link the application prior to execution is provided by the
+ * caller, not by the system.
+ * - Unlike execv(), this function always returns.
+ *
+ * This non-standard interface is included as a official NuttX API only
+ * because it is needed in certain build modes: exec() is probably the
+ * only way to load programs in the PROTECTED mode. Other file execution
+ * APIs rely on a symbol table provided by the OS. In the PROTECTED build
+ * mode, the OS cannot provide any meaningful symbolic information for
+ * execution of code in the user-space blob so that is the exec() function
+ * is really needed in that build case
+ *
+ * The interface is available in the FLAT build mode although it is not
+ * really necessary in that case. It is currently used by some example
+ * code under the apps/ that that generate their own symbol tables for
+ * linking test programs. So although it is not necessary, it can still
+ * be useful.
+ *
+ * The interface would be completely useless and will not be supported in
+ * in the KERNEL build mode where the contrary is true: An application
+ * process cannot provide any meaningful symbolic information for use in
+ * linking a different process.
+ *
+ * NOTE: This function is flawed and useless without CONFIG_BINFMT_LOADABLE
+ * because without that features there is then no mechanism to unload the
+ * module once it exits.
+ *
+ * Input Parameters:
+ * filename - The path to the program to be executed. If
+ * CONFIG_LIB_ENVPATH is defined in the configuration, then
+ * this may be a relative path from the current working
+ * directory. Otherwise, path must be the absolute path to the
+ * program.
+ * argv - A pointer to an array of string arguments. The end of the
+ * array is indicated with a NULL entry.
+ * exports - The address of the start of the caller-provided symbol
+ * table. This symbol table contains the addresses of symbols
+ * exported by the caller and made available for linking the
+ * module into the system.
+ * nexports - The number of symbols in the exports table.
+ *
+ * Returned Value:
+ * This is an end-user function, so it follows the normal convention:
+ * It returns the PID of the exec'ed module. On failure, it returns
+ * -1 (ERROR) and sets errno appropriately.
+ *
+ ****************************************************************************/
+
+int exec(FAR const char *filename, FAR char * const *argv,
+ FAR const struct symtab_s *exports, int nexports)
+{
+ return exec_spawn(filename, argv, exports, nexports, NULL);
+}
+
#endif /* !CONFIG_BINFMT_DISABLE */
diff --git a/include/nuttx/binfmt/binfmt.h b/include/nuttx/binfmt/binfmt.h
index 88b2d40..b3f22ec 100644
--- a/include/nuttx/binfmt/binfmt.h
+++ b/include/nuttx/binfmt/binfmt.h
@@ -42,6 +42,8 @@
#include <nuttx/config.h>
+#include <spawn.h>
+
#include <sys/types.h>
#include <nuttx/arch.h>
@@ -314,6 +316,39 @@ int exec(FAR const char *filename, FAR char * const *argv,
FAR const struct symtab_s *exports, int nexports);
/****************************************************************************
+ * Name: exec_spawn
+ *
+ * Description:
+ * exec() configurable version, delivery the spawn attribute if this
+ * process has special customization.
+ *
+ * Input Parameters:
+ * filename - The path to the program to be executed. If
+ * CONFIG_LIB_ENVPATH is defined in the configuration, then
+ * this may be a relative path from the current working
+ * directory. Otherwise, path must be the absolute path to the
+ * program.
+ * argv - A pointer to an array of string arguments. The end of the
+ * array is indicated with a NULL entry.
+ * exports - The address of the start of the caller-provided symbol
+ * table. This symbol table contains the addresses of symbols
+ * exported by the caller and made available for linking the
+ * module into the system.
+ * nexports - The number of symbols in the exports table.
+ * attr - The spawn attributes.
+ *
+ * Returned Value:
+ * This is an end-user function, so it follows the normal convention:
+ * It returns the PID of the exec'ed module. On failure, it returns
+ * -1 (ERROR) and sets errno appropriately.
+ *
+ ****************************************************************************/
+
+int exec_spawn(FAR const char *filename, FAR char * const *argv,
+ FAR const struct symtab_s *exports, int nexports,
+ FAR const posix_spawnattr_t *attr);
+
+/****************************************************************************
* Name: binfmt_exit
*
* Description:
diff --git a/sched/task/task_posixspawn.c b/sched/task/task_posixspawn.c
index 88cac9f..c559e2c 100644
--- a/sched/task/task_posixspawn.c
+++ b/sched/task/task_posixspawn.c
@@ -120,7 +120,7 @@ static int nxposix_spawn_exec(FAR pid_t *pidp, FAR const char *path,
/* Start the task */
- pid = exec(path, (FAR char * const *)argv, symtab, nsymbols);
+ pid = exec_spawn(path, (FAR char * const *)argv, symtab, nsymbols, attr);
if (pid < 0)
{
ret = get_errno();