You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by ag...@apache.org on 2020/05/27 19:00:26 UTC
[incubator-nuttx] branch master updated:
sched/sched/sched_releasetcb.c: Handle custom stack allocations.
This is an automated email from the ASF dual-hosted git repository.
aguettouche pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git
The following commit(s) were added to refs/heads/master by this push:
new 124e6ee sched/sched/sched_releasetcb.c: Handle custom stack allocations.
124e6ee is described below
commit 124e6ee53d0b4f71bc76a206cff61777ac8c5e91
Author: Gregory Nutt <gn...@nuttx.org>
AuthorDate: Wed May 27 11:33:20 2020 -0600
sched/sched/sched_releasetcb.c: Handle custom stack allocations.
sched_releasetcb() will normally free the stack allocated for a task. However, a task with a custom, user-managed stack may be created using nxtask_init() followed by nxtask_activer. If such a custom stack is used then it must not be free in this many or a crash will most likely result.
This chagne addes a flag call TCB_FLAG_CUSTOM_STACK that may be passed in the the pre-allocted TCB to nxtask_init(). This flag is not used internally anywhere in the OS except that if set, it will prevent sched_releasetcb() from freeing that custom stack.
---
include/nuttx/sched.h | 17 ++++++++++++++---
sched/sched/sched_releasetcb.c | 7 +++++--
sched/task/task_init.c | 10 ++++++++++
3 files changed, 29 insertions(+), 5 deletions(-)
diff --git a/include/nuttx/sched.h b/include/nuttx/sched.h
index b19cf68..54e11b7 100644
--- a/include/nuttx/sched.h
+++ b/include/nuttx/sched.h
@@ -103,9 +103,10 @@
# define TCB_FLAG_SCHED_SPORADIC (2 << TCB_FLAG_POLICY_SHIFT) /* Sporadic scheding policy */
# define TCB_FLAG_SCHED_OTHER (3 << TCB_FLAG_POLICY_SHIFT) /* Other scheding policy */
#define TCB_FLAG_CPU_LOCKED (1 << 7) /* Bit 7: Locked to this CPU */
-#define TCB_FLAG_SIGNAL_ACTION (1 << 8) /* Bit 8: In a signal handler */
-#define TCB_FLAG_SYSCALL (1 << 9) /* Bit 9: In a system call */
-#define TCB_FLAG_EXIT_PROCESSING (1 << 10) /* Bit 10: Exitting */
+#define TCB_FLAG_CUSTOM_STACK (1 << 8) /* Bit 8: Thread uses a custom stack */
+#define TCB_FLAG_SIGNAL_ACTION (1 << 9) /* Bit 9: In a signal handler */
+#define TCB_FLAG_SYSCALL (1 << 10) /* Bit 10: In a system call */
+#define TCB_FLAG_EXIT_PROCESSING (1 << 11) /* Bit 11: Exitting */
/* Bits 11-15: Available */
/* Values for struct task_group tg_flags */
@@ -920,6 +921,14 @@ FAR struct socketlist *nxsched_get_sockets(void);
* 2. Allocate the stack. The pre-allocated stack is passed in argv.
* 3. Activate the task. This must be done by calling nxtask_activate().
*
+ * Certain fields of the pre-allocated TCB may be set to change the
+ * nature of the created task. For example:
+ *
+ * - Task type may be set in the TCB flags to create kernel thread
+ * - If a custom stack is used, i.e., one allocated, managed, and freed
+ * by the caller, then TCB_FLAG_CUSTOM_STACK should be set in the
+ * TCB flags.
+ *
* Input Parameters:
* tcb - Address of the new task's TCB
* name - Name of the new task (not used)
@@ -954,6 +963,8 @@ int nxtask_init(FAR struct tcb_s *tcb, const char *name, int priority,
* was when a subsequent call to task_activate fails.
*
* Caution: Freeing of the TCB itself might be an unexpected side-effect.
+ * The stack will also be freed UNLESS TCB_FLAG_CUSTOM_STACK was set in
+ * in the tcb->flags field when nxtask_init() was called.
*
* Input Parameters:
* tcb - Address of the TCB initialized by task_init()
diff --git a/sched/sched/sched_releasetcb.c b/sched/sched/sched_releasetcb.c
index 5cf57b6..00e6355 100644
--- a/sched/sched/sched_releasetcb.c
+++ b/sched/sched/sched_releasetcb.c
@@ -127,9 +127,12 @@ int nxsched_release_tcb(FAR struct tcb_s *tcb, uint8_t ttype)
nxsched_releasepid(tcb->pid);
}
- /* Delete the thread's stack if one has been allocated */
+ /* Delete the thread's stack if one has been allocated and it is
+ * not some custom stack managed by the caller.
+ */
- if (tcb->stack_alloc_ptr)
+ if (tcb->stack_alloc_ptr &&
+ (tcb->flags & TCB_FLAG_CUSTOM_STACK) == 0)
{
#ifdef CONFIG_BUILD_KERNEL
/* If the exiting thread is not a kernel thread, then it has an
diff --git a/sched/task/task_init.c b/sched/task/task_init.c
index 315e6b6..91c7904 100644
--- a/sched/task/task_init.c
+++ b/sched/task/task_init.c
@@ -54,6 +54,14 @@
* 2. Allocate the stack. The pre-allocated stack is passed in argv.
* 3. Activate the task. This must be done by calling nxtask_activate().
*
+ * Certain fields of the pre-allocated TCB may be set to change the
+ * nature of the created task. For example:
+ *
+ * - Task type may be set in the TCB flags to create kernel thread
+ * - If a custom stack is used, i.e., one allocated, managed, and freed
+ * by the caller, then TCB_FLAG_CUSTOM_STACK should be set in the
+ * TCB flags.
+ *
* Input Parameters:
* tcb - Address of the new task's TCB
* name - Name of the new task (not used)
@@ -148,6 +156,8 @@ errout:
* was when a subsequent call to task_activate fails.
*
* Caution: Freeing of the TCB itself might be an unexpected side-effect.
+ * The stack will also be freed UNLESS TCB_FLAG_CUSTOM_STACK was set in
+ * in the tcb->flags field when nxtask_init() was called.
*
* Input Parameters:
* tcb - Address of the TCB initialized by task_init()