You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2021/07/15 15:23:58 UTC
[incubator-nuttx] 02/02: sched/init: initialize all idle thread's
tl_task
This is an automated email from the ASF dual-hosted git repository.
xiaoxiang pushed a commit to branch init
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git
commit 2883234a0dee7aa69680f44dfb377bbe55cfc444
Author: Xiang Xiao <xi...@xiaomi.com>
AuthorDate: Thu Jul 15 18:25:48 2021 +0800
sched/init: initialize all idle thread's tl_task
commit 50c08bf45b1adcafc409480f300ac49a4b2c689c
Author: Huang Qi <hu...@xiaomi.com>
Date: Tue Jun 29 16:01:02 2021 +0800
libc: Move pthread_key_destructor to task_info_s
Signed-off-by: Xiang Xiao <xi...@xiaomi.com>
Change-Id: If7d0c0118323fa3dcf44081d675cd57b14eba75a
---
sched/init/nx_smpstart.c | 27 +--------------------
sched/init/nx_start.c | 61 +++++++++++++++++++++++++++++-------------------
2 files changed, 38 insertions(+), 50 deletions(-)
diff --git a/sched/init/nx_smpstart.c b/sched/init/nx_smpstart.c
index 4bcb712..bb7675d 100644
--- a/sched/init/nx_smpstart.c
+++ b/sched/init/nx_smpstart.c
@@ -34,7 +34,6 @@
#include <nuttx/kmalloc.h>
#include <nuttx/sched.h>
#include <nuttx/sched_note.h>
-#include <nuttx/tls.h>
#include "group/group.h"
#include "sched/sched.h"
@@ -113,31 +112,7 @@ int nx_smp_start(void)
int ret;
int cpu;
- /* Create a stack for all CPU IDLE threads (except CPU0 which already has
- * a stack).
- */
-
- for (cpu = 1; cpu < CONFIG_SMP_NCPUS; cpu++)
- {
- FAR struct tcb_s *tcb = current_task(cpu);
- DEBUGASSERT(tcb != NULL);
-
- ret = up_cpu_idlestack(cpu, tcb, CONFIG_IDLETHREAD_STACKSIZE);
- if (ret < 0)
- {
- serr("ERROR: Failed to allocate stack for CPU%d\n", cpu);
- return ret;
- }
-
- /* Initialize the processor-specific portion of the TCB */
-
- up_initial_state(tcb);
- up_stack_frame(tcb, sizeof(struct task_info_s));
- }
-
- /* Then start all of the other CPUs after we have completed the memory
- * allocations. CPU0 is already running.
- */
+ /* Start all of the other CPUs. CPU0 is already running. */
for (cpu = 1; cpu < CONFIG_SMP_NCPUS; cpu++)
{
diff --git a/sched/init/nx_start.c b/sched/init/nx_start.c
index eff067d..97d11ad 100644
--- a/sched/init/nx_start.c
+++ b/sched/init/nx_start.c
@@ -475,16 +475,6 @@ void nx_start(void)
/* Mark the idle task as the running task */
g_running_tasks[i] = &g_idletcb[i].cmn;
-
- /* Initialize the 1st processor-specific portion of the TCB
- * Note: other idle thread get initialized in nx_smpstart
- */
-
- if (i == 0)
- {
- up_initial_state(&g_idletcb[i].cmn);
- up_stack_frame(&g_idletcb[i].cmn, sizeof(struct task_info_s));
- }
}
/* Task lists are initialized */
@@ -566,8 +556,11 @@ void nx_start(void)
g_pidhash[i].pid = INVALID_PROCESS_ID;
}
+ /* IDLE Group Initialization **********************************************/
+
for (i = 0; i < CONFIG_SMP_NCPUS; i++)
{
+ FAR struct tls_info_s *info;
int hashndx;
/* Assign the process ID(s) of ZERO to the idle task(s) */
@@ -575,6 +568,39 @@ void nx_start(void)
hashndx = PIDHASH(i);
g_pidhash[hashndx].tcb = &g_idletcb[i].cmn;
g_pidhash[hashndx].pid = i;
+
+ /* Allocate the IDLE group */
+
+ DEBUGVERIFY(group_allocate(&g_idletcb[i], g_idletcb[i].cmn.flags));
+
+#ifdef CONFIG_SMP
+ /* Create a stack for all CPU IDLE threads (except CPU0 which already
+ * has a stack).
+ */
+
+ if (i > 0)
+ {
+ DEBUGVERIFY(up_cpu_idlestack(i, &g_idletcb[i].cmn,
+ CONFIG_IDLETHREAD_STACKSIZE));
+ }
+#endif
+
+ /* Initialize the processor-specific portion of the TCB */
+
+ up_initial_state(&g_idletcb[i].cmn);
+
+ /* Initialize the thread local storage */
+
+ info = up_stack_frame(&g_idletcb[i].cmn, sizeof(struct tls_info_s));
+ DEBUGASSERT(info == g_idletcb[i].cmn.stack_alloc_ptr);
+ info->tl_task = g_idletcb[i].cmn.group->tg_info;
+
+ /* Complete initialization of the IDLE group. Suppress retention
+ * of child status in the IDLE group.
+ */
+
+ DEBUGVERIFY(group_initialize(&g_idletcb[i]));
+ g_idletcb[i].cmn.group->tg_flags = GROUP_FLAG_NOCLDWAIT;
}
g_lastpid = CONFIG_SMP_NCPUS - 1;
@@ -703,20 +729,14 @@ void nx_start(void)
binfmt_initialize();
#endif
- /* IDLE Group Initialization **********************************************/
-
/* Announce that the CPU0 IDLE task has started */
sched_note_start(&g_idletcb[0].cmn);
- /* Initialize the IDLE group for the IDLE task of each CPU */
+ /* Initialize tdout, stderr, stdin for the IDLE task of each CPU */
for (i = 0; i < CONFIG_SMP_NCPUS; i++)
{
- /* Allocate the IDLE group */
-
- DEBUGVERIFY(group_allocate(&g_idletcb[i], g_idletcb[i].cmn.flags));
-
if (i > 0)
{
/* Clone stdout, stderr, stdin from the CPU0 IDLE task. */
@@ -732,13 +752,6 @@ void nx_start(void)
DEBUGVERIFY(group_setupidlefiles(&g_idletcb[i]));
}
-
- /* Complete initialization of the IDLE group. Suppress retention
- * of child status in the IDLE group.
- */
-
- DEBUGVERIFY(group_initialize(&g_idletcb[i]));
- g_idletcb[i].cmn.group->tg_flags = GROUP_FLAG_NOCLDWAIT;
}
/* Start SYSLOG ***********************************************************/