From: SL B. <st...@bs...> - 2002-04-24 07:28:09
|
This patch is against lkcdutils-4.1-pre2. This patch adds the `-t type' option to the `task' command. The default behavior is unchanged. >> task -t run Lists only runable tasks >> task -t unrun Lists only unrunable tasks >> task -t stop Lists only stopped tasks >> task -t all Lists everything, current behavior, default >> task -t run ADDR UID PID PPID STATE FLAGS CPU NAME =============================================================================== 0xc02f2000 0 0 0 0 0x4 - swapper 0xc4ab2000 0 24105 15833 0 0x4 1 lcrash =============================================================================== 2 runable task structs found >> --- lkcdutils/lcrash/struct.c~ Thu Apr 4 10:01:22 2002 +++ lkcdutils/lcrash/struct.c Thu Apr 4 18:13:36 2002 @@ -492,9 +492,17 @@ addr = first_task; task_struct_banner(ofp, (BANNER|SMAJOR)); do { + unsigned int state; + if (kl_get_task_struct(addr, 2, tsp)) { break; } + state = KL_UINT(tsp, "task_struct", "state"); + if (((flags & C_RUNABLE) && (state != 0)) || + ((flags & C_UNRUNABLE) && (state >= 0)) || + ((flags & C_STOPPED) && (state <= 0))) { + goto next; + } if (first_time) { first_time = 0; } else if (flags & (C_FULL|C_NEXT)) { @@ -502,6 +510,7 @@ } print_task_struct(addr, tsp, flags, ofp); task_cnt++; +next: addr = kl_kaddr(tsp, "task_struct", "next_task"); #if (ARCH == ia64) /* XXX temporary HACK for snia64 */ if (kl_virtop(addr, NULL, &p1)) { --- lkcdutils/lcrash/cmds/cmd_task.c~ Fri Mar 22 10:31:17 2002 +++ lkcdutils/lcrash/cmds/cmd_task.c Fri Apr 5 09:27:04 2002 @@ -13,10 +13,20 @@ void *tsp; kaddr_t task; uint64_t value; + char *s; if (cmd->nargs == 0) { if (MIP->core_type == dev_kmem) { - fprintf(cmd->ofp, "ACTIVE TASKS:\n\n"); + if (cmd->flags & C_RUNABLE) { + s = "RUNABLE TASKS:\n\n"; + } else if (cmd->flags & C_UNRUNABLE) { + s = "UNRUNABLE TASKS:\n\n"; + } else if (cmd->flags & C_STOPPED) { + s = "STOPPED TASKS:\n\n"; + } else { + s = "ACTIVE TASKS:\n\n"; + } + fprintf(cmd->ofp, s); } task_cnt = print_active_tasks(cmd->flags, cmd->ofp); } else { @@ -36,15 +46,23 @@ } if ((mode == 1) || (mode == 2)) { + unsigned int state; + if (kl_get_task_struct(task, mode, tsp)) { continue; } if (mode == 1) { task = kl_pid_to_task(task); } - print_task_struct(task, tsp, - cmd->flags, cmd->ofp); - task_cnt++; + state = KL_UINT(tsp, "task_struct", "state"); + if (!(cmd->flags & (C_RUNABLE|C_UNRUNABLE|C_STOPPED)) || + ((cmd->flags & C_RUNABLE) && (state == 0)) || + ((cmd->flags & C_UNRUNABLE) && (state < 0)) || + ((cmd->flags & C_STOPPED) && (state > 0))) { + print_task_struct(task, tsp, + cmd->flags, cmd->ofp); + task_cnt++; + } } else { fprintf(KL_ERRORFP, "Invalid task : " "0x%lx\n", (long unsigned int )task); @@ -55,11 +73,21 @@ if (task_cnt) { task_struct_banner(cmd->ofp, SMAJOR); } - PLURAL("active task struct", task_cnt, cmd->ofp); + + if (cmd->flags & C_RUNABLE) { + s = "runable task struct"; + } else if (cmd->flags & C_UNRUNABLE) { + s = "unrunable task struct"; + } else if (cmd->flags & C_STOPPED) { + s = "stopped task struct"; + } else { + s = "active task struct"; + } + PLURAL(s, task_cnt, cmd->ofp); return(0); } -#define _TASK_USAGE "[-f] [-n] [-w outfile] [task list]" +#define _TASK_USAGE "[-f] [-n] [-w outfile] [-t runable|unrunable|stopped|all] [task list]" /* * task_usage() -- Print the usage string for the 'task' command. @@ -79,8 +107,9 @@ CMD_HELP(cmd, _TASK_USAGE, "Display relevant information for each entry in task_list. If " "no entries are specified, display information for all active " - "tasks. Entries in task_list can take the form of a virtual " - "address or a PID (following a '#')."); + "tasks. If the -t flag is given, only runable, unrunable, or " + "stopped tasks are displayed. Entries in task_list can take " + "the form of a virtual address or a PID (following a '#')."); } /* @@ -89,8 +118,30 @@ int task_parse(command_t *cmd) { - if (set_cmd_flags(cmd, (C_FULL|C_NEXT|C_WRITE), 0)) { + option_t *op; + char *flag; + + if (set_cmd_flags(cmd, (C_FULL|C_NEXT|C_WRITE), "t:")) { return(1); + } + op = cmd->options; + while (op) { + if (op->op_char != 't') { + goto cont; + } + flag = op->op_arg; + if (!strcmp(flag, "run") || !strcmp(flag, "runable")) { + cmd->flags |= C_RUNABLE; + } else if (!strcmp(flag, "unrun") || !strcmp(flag, "unrunable")) { + cmd->flags |= C_UNRUNABLE; + } else if (!strcmp(flag, "stop") || !strcmp(flag, "stopped")) { + cmd->flags |= C_STOPPED; + } else if (strcmp(flag, "all")) { + fprintf(cmd->efp, "%s: invalid type option.\n", flag); + return 1; + } +cont: + op = op->op_next; } return(0); } --- lkcdutils/lcrash/include/lc_command.h.nec Tue Apr 16 13:09:46 2002 +++ lkcdutils/lcrash/include/lc_command.h Tue Apr 16 14:16:14 2002 @@ -132,6 +132,9 @@ #define C_WHATIS (0x0400 << C_LFLG_SHFT) /* eval flag */ #define C_NOVARS (0x0800 << C_LFLG_SHFT) /* eval flag */ #define C_PADDR (0x1000 << C_LFLG_SHFT) /* address is physical */ +#define C_RUNABLE (0x2000 << C_LFLG_SHFT) /* task flag */ +#define C_UNRUNABLE (0x8000 << C_LFLG_SHFT) /* task flag */ +#define C_STOPPED (0x10000 << C_LFLG_SHFT) /* task flag */ /* "Local" flag for use by some commands to pass iteration threshold */ |