diff --git a/sched/pthread/pthread_create.c b/sched/pthread/pthread_create.c index c531d00b07a..1b836f50a0b 100644 --- a/sched/pthread/pthread_create.c +++ b/sched/pthread/pthread_create.c @@ -289,6 +289,27 @@ 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? @@ -410,27 +431,6 @@ 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 7d9904a0a0d..b187b74ebee 100644 --- a/sched/task/task_init.c +++ b/sched/task/task_init.c @@ -108,15 +108,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; - } - if (stack) { /* Use pre-allocated stack */ @@ -135,6 +126,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; + } + /* Setup to pass parameters to the new task */ nxtask_setup_arguments(tcb, name, argv);