sched/tls: drop ta_argv and g_idleargv

- replaces `ta_argv` with `stackargs`
- drops `ta_argv` from `task_info_s`
- drops `g_idleargv` and checks idle accordingly

Signed-off-by: Yanfeng Liu <yfliu2008@qq.com>
This commit is contained in:
Yanfeng Liu 2024-06-09 09:35:34 +08:00 committed by Xiang Xiao
parent 8a8c1f943e
commit 3b1f4562a0
6 changed files with 18 additions and 44 deletions

View File

@ -122,8 +122,6 @@ struct pthread_atfork_s
struct task_info_s
{
mutex_t ta_lock;
int ta_argc; /* Number of arguments */
FAR char **ta_argv; /* Name+start-up parameters */
#if CONFIG_TLS_TASK_NELEM > 0
uintptr_t ta_telem[CONFIG_TLS_TASK_NELEM]; /* Task local storage elements */
#endif

View File

@ -25,7 +25,7 @@
#include <nuttx/config.h>
#include <stdlib.h>
#include <nuttx/tls.h>
#include <nuttx/sched.h>
/****************************************************************************
* Public Functions
@ -33,12 +33,18 @@
/****************************************************************************
* Name: getprogname
*
* Note that previous impl returns address in the stack of main thread when
* used from a pthread, that is dangerous as main thread may end earlier.
****************************************************************************/
FAR const char *getprogname(void)
{
FAR struct task_info_s *info;
struct stackinfo_s si;
FAR struct tls_info_s *ti = tls_get_info();
uintptr_t ret = ti ? (uintptr_t)ti + ti->tl_size : 0;
int rc = nxsched_get_stackinfo(0, &si);
info = task_get_info();
return info->ta_argv[0];
return (rc >= 0 && ret && ((uintptr_t)si.stack_base_ptr) > ret) ?
((FAR char **)ret)[0] : NULL;
}

View File

@ -63,12 +63,11 @@ size_t group_argvstr(FAR struct tcb_s *tcb, FAR char *args, size_t size)
FAR struct addrenv_s *oldenv;
#endif
/* Perform sanity checks */
/* Sanity checks and idle tasks */
if (!tcb || !tcb->group || !tcb->group->tg_info)
if (!tcb || !tcb->group || !tcb->group->tg_info || size < 1 ||
is_idle_task(tcb))
{
/* Something is very wrong -> get out */
*args = '\0';
return 0;
}
@ -90,7 +89,7 @@ size_t group_argvstr(FAR struct tcb_s *tcb, FAR char *args, size_t size)
else
#endif
{
FAR char **argv = tcb->group->tg_info->ta_argv + 1;
FAR char **argv = nxsched_get_stackargs(tcb) + 1;
while (*argv != NULL && n < size)
{

View File

@ -210,21 +210,10 @@ static struct tcb_s g_idletcb[CONFIG_SMP_NCPUS];
/* This is the name of the idle task */
#if CONFIG_TASK_NAME_SIZE <= 0 || !defined(CONFIG_SMP)
# ifdef CONFIG_SMP
static const char g_idlename[] = "CPU_Idle";
# else
#if CONFIG_TASK_NAME_SIZE > 0 && !defined(CONFIG_SMP)
static const char g_idlename[] = "Idle_Task";
# endif
#endif
/* This is IDLE threads argument list. NOTE: Normally the argument
* list is created on the stack prior to starting the task. We have to
* do things little differently here for the IDLE tasks.
*/
static FAR char *g_idleargv[CONFIG_SMP_NCPUS][2];
/****************************************************************************
* Private Functions
****************************************************************************/
@ -420,17 +409,6 @@ static void idle_task_initialize(void)
strlcpy(tcb->name, g_idlename, CONFIG_TASK_NAME_SIZE);
# endif
/* Configure the task name in the argument list. The IDLE task does
* not really have an argument list, but this name is still useful
* for things like the NSH PS command.
*
* In the kernel mode build, the arguments are saved on the task's
* stack and there is no support that yet.
*/
g_idleargv[i][0] = tcb->name;
#else
g_idleargv[i][0] = (FAR char *)g_idlename;
#endif /* CONFIG_TASK_NAME_SIZE */
/* Then add the idle task's TCB to the head of the current ready to
@ -477,7 +455,6 @@ static void idle_group_initialize(void)
DEBUGVERIFY(
group_initialize((FAR struct task_tcb_s *)tcb, tcb->flags));
tcb->group->tg_info->ta_argv = &g_idleargv[i][0];
/* Initialize the task join */

View File

@ -96,6 +96,7 @@ FAR struct task_tcb_s *nxtask_setup_fork(start_t retaddr)
FAR struct tcb_s *ptcb = this_task();
FAR struct tcb_s *parent;
FAR struct task_tcb_s *child;
FAR char **argv;
size_t stack_size;
uint8_t ttype;
int priority;
@ -211,8 +212,8 @@ FAR struct task_tcb_s *nxtask_setup_fork(start_t retaddr)
/* Setup to pass parameters to the new task */
ret = nxtask_setup_arguments(child, parent->group->tg_info->ta_argv[0],
&parent->group->tg_info->ta_argv[1]);
argv = nxsched_get_stackargs(parent);
ret = nxtask_setup_arguments(child, argv[0], &argv[1]);
if (ret < OK)
{
goto errout_with_tcb;

View File

@ -528,7 +528,6 @@ static int nxtask_setup_stackargs(FAR struct task_tcb_s *tcb,
FAR const char *name,
FAR char * const argv[])
{
uint8_t ttype = tcb->cmn.flags & TCB_FLAG_TTYPE_MASK;
FAR char **stackargv;
FAR char *str;
size_t strtablen;
@ -632,12 +631,6 @@ static int nxtask_setup_stackargs(FAR struct task_tcb_s *tcb,
stackargv[argc + 1] = NULL;
if (ttype != TCB_FLAG_TTYPE_KERNEL)
{
tcb->cmn.group->tg_info->ta_argc = argc;
tcb->cmn.group->tg_info->ta_argv = stackargv;
}
return OK;
}