NSH: PS-Command: print out the stack usage if stack coloration is enabled.
This commit is contained in:
parent
ac24acf69e
commit
65e050dbfb
@ -130,12 +130,17 @@ static const char g_scheduler[] = "Scheduler:";
|
|||||||
static const char g_sigmask[] = "SigMask:";
|
static const char g_sigmask[] = "SigMask:";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_STACK_COLORATION
|
||||||
|
static const char g_stacksize[] = "StackSize:";
|
||||||
|
static const char g_stackused[] = "StackUsed:";
|
||||||
|
#endif
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Private Functions
|
* Private Functions
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: ps_callback
|
* Name: nsh_parse_statusline
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#ifndef CONFIG_NSH_DISABLE_PS
|
#ifndef CONFIG_NSH_DISABLE_PS
|
||||||
@ -261,9 +266,14 @@ static int ps_callback(FAR struct nsh_vtbl_s *vtbl, FAR const char *dirpath,
|
|||||||
FAR char *nextline;
|
FAR char *nextline;
|
||||||
int ret;
|
int ret;
|
||||||
int i;
|
int i;
|
||||||
|
#ifdef CONFIG_STACK_COLORATION
|
||||||
|
int stack_size;
|
||||||
|
int stack_used;
|
||||||
|
float stack_filled;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Task/thread entries in the /proc directory will all be (1) directories with
|
/* Task/thread entries in the /proc directory will all be (1) directories
|
||||||
* (2) all numeric names.
|
* with (2) all numeric names.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (!DIRENT_ISDIRECTORY(entryp->d_type))
|
if (!DIRENT_ISDIRECTORY(entryp->d_type))
|
||||||
@ -377,6 +387,85 @@ static int ps_callback(FAR struct nsh_vtbl_s *vtbl, FAR const char *dirpath,
|
|||||||
nsh_output(vtbl, "%-8s ", status.td_sigmask);
|
nsh_output(vtbl, "%-8s ", status.td_sigmask);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_STACK_COLORATION
|
||||||
|
/* Get the StackSize and StackUsed */
|
||||||
|
|
||||||
|
stack_size = 0;
|
||||||
|
stack_used = 0;
|
||||||
|
filepath = NULL;
|
||||||
|
|
||||||
|
ret = asprintf(&filepath, "%s/%s/stack", dirpath, entryp->d_name);
|
||||||
|
if (ret < 0 || filepath == NULL)
|
||||||
|
{
|
||||||
|
nsh_output(vtbl, g_fmtcmdfailed, "ps", "asprintf", NSH_ERRNO);
|
||||||
|
vtbl->iobuffer[0] = '\0';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ret = nsh_readfile(vtbl, "ps", filepath, vtbl->iobuffer, IOBUFFERSIZE);
|
||||||
|
free(filepath);
|
||||||
|
|
||||||
|
if (ret >= 0)
|
||||||
|
{
|
||||||
|
nextline = vtbl->iobuffer;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
/* Find the beginning of the next line and NUL-terminate the
|
||||||
|
* current line.
|
||||||
|
*/
|
||||||
|
|
||||||
|
line = nextline;
|
||||||
|
for (nextline++;
|
||||||
|
*nextline != '\n' && *nextline != '\0';
|
||||||
|
nextline++);
|
||||||
|
|
||||||
|
if (*nextline == '\n')
|
||||||
|
{
|
||||||
|
*nextline++ = '\0';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nextline = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Parse the current line
|
||||||
|
*
|
||||||
|
* Format:
|
||||||
|
*
|
||||||
|
* 111111111122222222223
|
||||||
|
* 123456789012345678901234567890
|
||||||
|
* StackBase: xxxxxxxxxx
|
||||||
|
* StackSize: xxxx
|
||||||
|
* StackUsed: xxxx
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (strncmp(line, g_stacksize, strlen(g_stacksize)) == 0)
|
||||||
|
{
|
||||||
|
stack_size = atoi(&line[12]);
|
||||||
|
}
|
||||||
|
else if (strncmp(line, g_stackused, strlen(g_stackused)) == 0)
|
||||||
|
{
|
||||||
|
stack_used = atoi(&line[12]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (nextline != NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
nsh_output(vtbl, "%6.6d ", stack_size);
|
||||||
|
nsh_output(vtbl, "%6.6d ", stack_used);
|
||||||
|
|
||||||
|
stack_filled = 0.0;
|
||||||
|
if (stack_size && stack_used)
|
||||||
|
{
|
||||||
|
stack_filled = (100.0 / stack_size * stack_used);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Additionally print a "!" if the stack is filled more than 80% */
|
||||||
|
|
||||||
|
nsh_output(vtbl, "%5.1f%%%s ", stack_filled, (stack_filled >= 80 ? "!" : " "));
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef NSH_HAVE_CPULOAD
|
#ifdef NSH_HAVE_CPULOAD
|
||||||
/* Get the CPU load */
|
/* Get the CPU load */
|
||||||
|
|
||||||
@ -478,6 +567,11 @@ int cmd_ps(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
|
|||||||
#ifndef CONFIG_DISABLE_SIGNALS
|
#ifndef CONFIG_DISABLE_SIGNALS
|
||||||
nsh_output(vtbl, "%-8s ", "SIGMASK");
|
nsh_output(vtbl, "%-8s ", "SIGMASK");
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef CONFIG_STACK_COLORATION
|
||||||
|
nsh_output(vtbl, "%6s ", "STACK");
|
||||||
|
nsh_output(vtbl, "%6s ", "USED");
|
||||||
|
nsh_output(vtbl, "%7s ", "FILLED");
|
||||||
|
#endif
|
||||||
#ifdef NSH_HAVE_CPULOAD
|
#ifdef NSH_HAVE_CPULOAD
|
||||||
nsh_output(vtbl, "%6s ", "CPU");
|
nsh_output(vtbl, "%6s ", "CPU");
|
||||||
#endif
|
#endif
|
||||||
@ -603,6 +697,7 @@ int cmd_usleep(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
|
|||||||
nsh_output(vtbl, g_fmtarginvalid, argv[0]);
|
nsh_output(vtbl, g_fmtarginvalid, argv[0]);
|
||||||
return ERROR;
|
return ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
usleep(usecs);
|
usleep(usecs);
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user