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 2023/02/17 15:35:51 UTC
[nuttx] branch master updated: sync ps/assert output
This is an automated email from the ASF dual-hosted git repository.
xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git
The following commit(s) were added to refs/heads/master by this push:
new 77f6319268 sync ps/assert output
77f6319268 is described below
commit 77f63192680c687674b0677219ff7237204f8153
Author: lilei19 <li...@xiaomi.com>
AuthorDate: Fri Feb 17 15:54:57 2023 +0800
sync ps/assert output
---
fs/procfs/fs_procfsproc.c | 31 ++-----------
include/nuttx/sched.h | 19 +++++++-
sched/misc/assert.c | 58 +++++++++++++++++++++---
sched/sched/Make.defs | 2 +-
sched/sched/sched_get_stateinfo.c | 95 +++++++++++++++++++++++++++++++++++++++
5 files changed, 167 insertions(+), 38 deletions(-)
diff --git a/fs/procfs/fs_procfsproc.c b/fs/procfs/fs_procfsproc.c
index e59651ea52..0fb6db8c8e 100644
--- a/fs/procfs/fs_procfsproc.c
+++ b/fs/procfs/fs_procfsproc.c
@@ -397,32 +397,6 @@ static FAR const struct proc_node_s * const g_groupinfo[] =
};
#define PROC_NGROUPNODES (sizeof(g_groupinfo)/sizeof(FAR const struct proc_node_s * const))
-/* Names of task/thread states */
-
-static FAR const char * const g_statenames[] =
-{
- "Invalid",
- "Waiting,Unlock",
- "Ready",
-#ifdef CONFIG_SMP
- "Assigned",
-#endif
- "Running",
- "Inactive",
- "Waiting,Semaphore",
- "Waiting,Signal"
-#if !defined(CONFIG_DISABLE_MQUEUE) || !defined(CONFIG_DISABLE_MQUEUE_SYSV)
- , "Waiting,MQ empty"
- , "Waiting,MQ full"
-#endif
-#ifdef CONFIG_PAGING
- , "Waiting,Paging fill"
-#endif
-#ifdef CONFIG_SIG_SIGSTOP_ACTION
- , "Stopped"
-#endif
-};
-
static FAR const char * const g_ttypenames[4] =
{
"Task",
@@ -494,6 +468,7 @@ static ssize_t proc_status(FAR struct proc_file_s *procfile,
{
FAR const char *policy;
FAR const char *name;
+ char state[32];
size_t remaining;
size_t linesize;
size_t copysize;
@@ -584,9 +559,9 @@ static ssize_t proc_status(FAR struct proc_file_s *procfile,
/* Show the thread state */
+ nxsched_get_stateinfo(tcb, state, sizeof(state));
linesize = procfs_snprintf(procfile->line, STATUS_LINELEN,
- "%-12s%s\n", "State:",
- g_statenames[tcb->task_state]);
+ "%-12s%s\n", "State:", state);
copysize = procfs_memcpy(procfile->line, linesize, buffer, remaining,
&offset);
diff --git a/include/nuttx/sched.h b/include/nuttx/sched.h
index 8eae2680bd..ebb9ba5c11 100644
--- a/include/nuttx/sched.h
+++ b/include/nuttx/sched.h
@@ -991,8 +991,7 @@ int nxtask_delete(pid_t pid);
* scheduler.
*
* Input Parameters:
- * tcb - The TCB for the task for the task (same as the nxtask_init
- * argument).
+ * tcb - The TCB for the task (same as the nxtask_init argument).
*
* Returned Value:
* None
@@ -1392,6 +1391,22 @@ int nxsched_set_affinity(pid_t pid, size_t cpusetsize,
int nxsched_get_stackinfo(pid_t pid, FAR struct stackinfo_s *stackinfo);
+/****************************************************************************
+ * Name: nxsched_get_stateinfo
+ *
+ * Description:
+ * Report information about a thread's state
+ *
+ * Input Parameters:
+ * tcb - The TCB for the task (same as the nxtask_init argument).
+ * state - User-provided location to return the state information.
+ * length - The size of the state
+ *
+ ****************************************************************************/
+
+void nxsched_get_stateinfo(FAR struct tcb_s *tcb, FAR char *state,
+ size_t length);
+
/****************************************************************************
* Name: nxsched_waitpid
*
diff --git a/sched/misc/assert.c b/sched/misc/assert.c
index 6f1a0cee52..e1afdd263f 100644
--- a/sched/misc/assert.c
+++ b/sched/misc/assert.c
@@ -70,6 +70,19 @@
static uint8_t g_last_regs[XCPTCONTEXT_SIZE];
+static FAR const char *g_policy[4] =
+{
+ "FIFO", "RR", "SPORADIC"
+};
+
+static FAR const char * const g_ttypenames[4] =
+{
+ "Task",
+ "pthread",
+ "Kthread",
+ "Invalid"
+};
+
/****************************************************************************
* Private Functions
****************************************************************************/
@@ -221,6 +234,8 @@ static void show_stacks(FAR struct tcb_s *rtcb)
static void dump_task(FAR struct tcb_s *tcb, FAR void *arg)
{
char args[64] = "";
+ char state[32];
+ FAR char *s;
#ifdef CONFIG_STACK_COLORATION
size_t stack_filled = 0;
size_t stack_used;
@@ -255,13 +270,24 @@ static void dump_task(FAR struct tcb_s *tcb, FAR void *arg)
group_argvstr(tcb, args, sizeof(args));
+ /* get the task_state */
+
+ nxsched_get_stateinfo(tcb, state, sizeof(state));
+ if ((s = strchr(state, ',')) != NULL)
+ {
+ *s = ' ';
+ }
+
/* Dump interesting properties of this task */
- _alert(" %4d %4d"
+ _alert(" %4d %5d"
#ifdef CONFIG_SMP
" %4d"
#endif
- " %p"
+ " %3d %-8s %-7s %c%c%c"
+ " %-18s"
+ " %08" PRIx32
+ " %p"
" %7zu"
#ifdef CONFIG_STACK_COLORATION
" %7zu %3zu.%1zu%%%c"
@@ -270,10 +296,21 @@ static void dump_task(FAR struct tcb_s *tcb, FAR void *arg)
" %3zu.%01zu%%"
#endif
" %s%s\n"
- , tcb->pid, tcb->sched_priority
+ , tcb->pid
+ , tcb->group ? tcb->group->tg_pid : -1
#ifdef CONFIG_SMP
, tcb->cpu
#endif
+ , tcb->sched_priority
+ , g_policy[(tcb->flags & TCB_FLAG_POLICY_MASK) >>
+ TCB_FLAG_POLICY_SHIFT]
+ , g_ttypenames[(tcb->flags & TCB_FLAG_TTYPE_MASK)
+ >> TCB_FLAG_TTYPE_SHIFT]
+ , tcb->flags & TCB_FLAG_NONCANCELABLE ? 'N' : '-'
+ , tcb->flags & TCB_FLAG_CANCEL_PENDING ? 'P' : '-'
+ , tcb->flags & TCB_FLAG_EXIT_PROCESSING ? 'P' : '-'
+ , state
+ , tcb->sigprocmask
, tcb->stack_base_ptr
, tcb->adj_stack_size
#ifdef CONFIG_STACK_COLORATION
@@ -325,12 +362,15 @@ static void show_tasks(void)
/* Dump interesting properties of each task in the crash environment */
- _alert(" PID PRI"
+ _alert(" PID GROUP"
#ifdef CONFIG_SMP
" CPU"
#endif
- " STACKBASE"
- " STACKSIZE"
+ " PRI POLICY TYPE NPX"
+ " STATE EVENT"
+ " SIGMASK"
+ " STACKBASE"
+ " STACKSIZE"
#ifdef CONFIG_STACK_COLORATION
" USED FILLED "
#endif
@@ -344,7 +384,11 @@ static void show_tasks(void)
# ifdef CONFIG_SMP
" ----"
# endif
- " %p"
+ " --- --------"
+ " ------- ---"
+ " ------- ----------"
+ " --------"
+ " %p"
" %7u"
# ifdef CONFIG_STACK_COLORATION
" %7zu %3zu.%1zu%%%c"
diff --git a/sched/sched/Make.defs b/sched/sched/Make.defs
index ade87e00bf..c69caff613 100644
--- a/sched/sched/Make.defs
+++ b/sched/sched/Make.defs
@@ -28,7 +28,7 @@ CSRCS += sched_setscheduler.c sched_getscheduler.c
CSRCS += sched_yield.c sched_rrgetinterval.c sched_foreach.c
CSRCS += sched_lock.c sched_unlock.c sched_lockcount.c
CSRCS += sched_idletask.c sched_self.c sched_get_stackinfo.c
-CSRCS += sched_sysinfo.c sched_reprioritizertr.c
+CSRCS += sched_sysinfo.c sched_reprioritizertr.c sched_get_stateinfo.c
ifeq ($(CONFIG_PRIORITY_INHERITANCE),y)
CSRCS += sched_reprioritize.c
diff --git a/sched/sched/sched_get_stateinfo.c b/sched/sched/sched_get_stateinfo.c
new file mode 100644
index 0000000000..1f1d1d8444
--- /dev/null
+++ b/sched/sched/sched_get_stateinfo.c
@@ -0,0 +1,95 @@
+/****************************************************************************
+ * sched/sched/sched_get_stateinfo.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <string.h>
+#include <stdio.h>
+#include <semaphore.h>
+#include <nuttx/mutex.h>
+#include "nuttx/sched.h"
+
+/****************************************************************************
+ * Pre-processor types
+ ****************************************************************************/
+
+/* This is the state info of the task_state field of the TCB */
+
+static FAR const char * const g_statenames[] =
+{
+ "Invalid",
+ "Waiting,Unlock",
+ "Ready",
+#ifdef CONFIG_SMP
+ "Assigned",
+#endif
+ "Running",
+ "Inactive",
+ "Waiting,Semaphore",
+ "Waiting,Signal"
+#if !defined(CONFIG_DISABLE_MQUEUE) || !defined(CONFIG_DISABLE_MQUEUE_SYSV)
+ , "Waiting,MQ empty"
+ , "Waiting,MQ full"
+#endif
+#ifdef CONFIG_PAGING
+ , "Waiting,Paging fill"
+#endif
+#ifdef CONFIG_SIG_SIGSTOP_ACTION
+ , "Stopped"
+#endif
+};
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: nxsched_get_stateinfo
+ *
+ * Description:
+ * Report information about a thread's state
+ *
+ * Input Parameters:
+ * tcb - The TCB for the task (same as the nxtask_init argument).
+ * state - User-provided location to return the state information.
+ * length - The size of the state
+ *
+ ****************************************************************************/
+
+void nxsched_get_stateinfo(FAR struct tcb_s *tcb, FAR char *state,
+ size_t length)
+{
+ /* if the state is waiting mutex */
+
+ if (tcb->task_state == TSTATE_WAIT_SEM &&
+ ((FAR sem_t *)(tcb->waitobj))->flags & SEM_TYPE_MUTEX)
+ {
+ snprintf(state, length, "Waiting,Mutex:%d",
+ ((FAR mutex_t *)(tcb->waitobj))->holder);
+ }
+ else
+ {
+ strlcpy(state, g_statenames[tcb->task_state], length);
+ }
+}