From 6eba1ad90a3f49fc085e280d5e517a4656689732 Mon Sep 17 00:00:00 2001 From: Xiang Xiao Date: Fri, 16 Oct 2020 20:42:56 +0800 Subject: [PATCH] sched: Call up_[use|create]_stack after nxtask_setup_scheduler to ensure the basic info(e.g. pid) setup correctly before call arch API Signed-off-by: Xiang Xiao Change-Id: I851cb0fdf22f45844938dafc5981b3f576100dba --- sched/pthread/pthread_create.c | 42 +++++++++++++++++----------------- sched/task/task_init.c | 18 +++++++-------- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/sched/pthread/pthread_create.c b/sched/pthread/pthread_create.c index 1b836f50a0..c531d00b07 100644 --- a/sched/pthread/pthread_create.c +++ b/sched/pthread/pthread_create.c @@ -289,27 +289,6 @@ int pthread_create(FAR pthread_t *thread, FAR const pthread_attr_t *attr, pjoin->detached = true; } - if (attr->stackaddr) - { - /* Use pre-allocated stack */ - - ret = up_use_stack((FAR struct tcb_s *)ptcb, attr->stackaddr, - attr->stacksize); - } - else - { - /* Allocate the stack for the TCB */ - - ret = up_create_stack((FAR struct tcb_s *)ptcb, attr->stacksize, - TCB_FLAG_TTYPE_PTHREAD); - } - - if (ret != OK) - { - errcode = ENOMEM; - goto errout_with_join; - } - /* Should we use the priority and scheduler specified in the pthread * attributes? Or should we use the current thread's priority and * scheduler? @@ -431,6 +410,27 @@ int pthread_create(FAR pthread_t *thread, FAR const pthread_attr_t *attr, } #endif + if (attr->stackaddr) + { + /* Use pre-allocated stack */ + + ret = up_use_stack((FAR struct tcb_s *)ptcb, attr->stackaddr, + attr->stacksize); + } + else + { + /* Allocate the stack for the TCB */ + + ret = up_create_stack((FAR struct tcb_s *)ptcb, attr->stacksize, + TCB_FLAG_TTYPE_PTHREAD); + } + + if (ret != OK) + { + errcode = ENOMEM; + goto errout_with_join; + } + /* Configure the TCB for a pthread receiving on parameter * passed by value */ diff --git a/sched/task/task_init.c b/sched/task/task_init.c index b187b74ebe..7d9904a0a0 100644 --- a/sched/task/task_init.c +++ b/sched/task/task_init.c @@ -108,6 +108,15 @@ int nxtask_init(FAR struct task_tcb_s *tcb, const char *name, int priority, goto errout_with_group; } + /* Initialize the task control block */ + + ret = nxtask_setup_scheduler(tcb, priority, nxtask_start, + entry, ttype); + if (ret < OK) + { + goto errout_with_group; + } + if (stack) { /* Use pre-allocated stack */ @@ -126,15 +135,6 @@ int nxtask_init(FAR struct task_tcb_s *tcb, const char *name, int priority, goto errout_with_group; } - /* Initialize the task control block */ - - ret = nxtask_setup_scheduler(tcb, priority, nxtask_start, - entry, ttype); - if (ret < OK) - { - goto errout_with_group; - } - /* Setup to pass parameters to the new task */ nxtask_setup_arguments(tcb, name, argv);