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);
+    }
+}