PERFORCE change 34250 for review
John Baldwin
jhb at FreeBSD.org
Wed Jul 9 10:58:19 PDT 2003
http://perforce.freebsd.org/chv.cgi?CH=34250
Change 34250 by jhb at jhb_laptop on 2003/07/09 10:58:01
First cut at adding generic pager support into ddb's output
routines. Convert 'ps' to use this method. By the way, I
think it would be a good idea if ps just showed procs and a
separate 'show threads' command showed actual threads. This
is how mach does things apparently.
Affected files ...
.. //depot/projects/smpng/sys/ddb/db_command.c#13 edit
.. //depot/projects/smpng/sys/ddb/db_output.c#4 edit
.. //depot/projects/smpng/sys/ddb/db_ps.c#21 edit
.. //depot/projects/smpng/sys/ddb/ddb.h#8 edit
Differences ...
==== //depot/projects/smpng/sys/ddb/db_command.c#13 (text+ko) ====
@@ -343,7 +343,9 @@
/*
* Execute the command.
*/
+ db_setup_paging(NULL, NULL, -1);
(*cmd->fcn)(addr, have_addr, count, modif);
+ db_setup_paging(NULL, NULL, -1);
if (cmd->flag & CS_SET_DOT) {
/*
==== //depot/projects/smpng/sys/ddb/db_output.c#4 (text+ko) ====
@@ -62,6 +62,10 @@
#define NEXT_TAB(i) \
((((i) + db_tab_stop_width) / db_tab_stop_width) * db_tab_stop_width)
db_expr_t db_max_width = 79; /* output line width */
+static int db_newlines = 0; /* # lines this page */
+static int db_maxlines = -1; /* max lines per page */
+static db_page_calloutfcn_t *db_page_callout = NULL;
+static void *db_page_callout_arg = NULL;
static void db_putchar(int c, void *arg);
@@ -98,6 +102,7 @@
int c; /* character to output */
void * arg;
{
+
if (c > ' ' && c <= '~') {
/*
* Printing character.
@@ -115,6 +120,14 @@
db_output_position = 0;
db_last_non_space = 0;
db_check_interrupt();
+ if (db_maxlines > 0 && db_page_callout != NULL) {
+ db_newlines++;
+ if (db_newlines >= db_maxlines) {
+ db_maxlines = -1;
+ db_page_callout(db_page_callout_arg);
+ db_newlines = 0;
+ }
+ }
}
else if (c == '\r') {
/* Return */
@@ -139,6 +152,56 @@
}
/*
+ * Register callout for providing a pager for output.
+ */
+void
+db_setup_paging(db_page_calloutfcn_t *callout, void *arg, int maxlines)
+{
+
+ db_page_callout = callout;
+ db_page_callout_arg = arg;
+ db_maxlines = maxlines;
+}
+
+/*
+ * A simple paging callout function. If the argument is not null, it
+ * points to an integer that will be set to 1 if the user asks to quit.
+ */
+void
+db_simple_pager(void *arg)
+{
+ int c;
+
+ db_printf("--More--\r");
+ for (;;) {
+ c = cngetc();
+ switch (c) {
+ case '\n':
+ /* Just one more line. */
+ db_setup_paging(db_simple_pager, arg, 1);
+ return;
+ case ' ':
+ /* Another page. */
+ db_setup_paging(db_simple_pager, arg,
+ DB_LINES_PER_PAGE);
+ return;
+ case 'q':
+ case 'Q':
+ case 'x':
+ case 'X':
+ /* Quit */
+ if (arg != NULL) {
+ *(int *)arg = 1;
+ return;
+ }
+ /* FALLTHROUGH */
+ default:
+ cnputc('\007');
+ }
+ }
+}
+
+/*
* Return output position
*/
int
==== //depot/projects/smpng/sys/ddb/db_ps.c#21 (text+ko) ====
@@ -55,13 +55,13 @@
db_expr_t dummy3;
char * dummy4;
{
- int np;
- int nl = 0;
volatile struct proc *p, *pp;
volatile struct thread *td;
char *state;
+ int np, quit;
np = nprocs;
+ quit = 0;
/* sx_slock(&allproc_lock); */
if (!LIST_EMPTY(&allproc))
@@ -69,32 +69,9 @@
else
p = &proc0;
+ db_setup_paging(db_simple_pager, &quit, DB_LINES_PER_PAGE);
db_printf(" pid proc addr uid ppid pgrp flag stat wmesg wchan cmd\n");
- while (--np >= 0) {
- /*
- * XXX just take 20 for now...
- */
- if (nl++ >= 20) {
- int c;
-
- db_printf("--More--");
- c = cngetc();
- db_printf("\r");
- /*
- * A whole screenfull or just one line?
- */
- switch (c) {
- case '\n': /* just one line */
- nl = 20;
- break;
- case ' ':
- nl = 0; /* another screenfull */
- break;
- default: /* exit */
- db_printf("\n");
- return;
- }
- }
+ while (--np >= 0 && !quit) {
if (p == NULL) {
printf("oops, ran out of processes early!\n");
break;
@@ -131,7 +108,8 @@
db_printf("(threaded) %s\n", p->p_comm);
FOREACH_THREAD_IN_PROC(p, td) {
dumpthread(p, td);
- nl++;
+ if (quit)
+ break;
}
/* PROC_UNLOCK(p); */
@@ -145,6 +123,7 @@
static void
dumpthread(volatile struct proc *p, volatile struct thread *td)
{
+
if (p->p_flag & P_SA)
db_printf( " thread %p ksegrp %p ", td, td->td_ksegrp);
if (TD_ON_SLEEPQ(td)) {
==== //depot/projects/smpng/sys/ddb/ddb.h#8 (text+ko) ====
@@ -39,9 +39,13 @@
#include <machine/db_machdep.h> /* type definitions */
+#define DB_LINES_PER_PAGE 20
+
typedef void db_cmdfcn_t(db_expr_t addr, boolean_t have_addr, db_expr_t count,
char *modif);
+typedef void db_page_calloutfcn_t(void *arg);
+
#define DB_COMMAND(cmd_name, func_name) \
DB_SET(cmd_name, func_name, db_cmd_set, 0, NULL)
#define DB_SHOW_COMMAND(cmd_name, func_name) \
@@ -100,6 +104,8 @@
int db_readline(char *lstart, int lsize);
void db_restart_at_pc(boolean_t watchpt);
void db_set_watchpoints(void);
+void db_setup_paging(db_page_calloutfcn_t *callout, void *arg,
+ int maxlines);
void db_skip_to_eol(void);
boolean_t db_stop_at_pc(boolean_t *is_breakpoint);
#define db_strcpy strcpy
@@ -139,6 +145,8 @@
db_cmdfcn_t vm_page_print;
#endif
+db_page_calloutfcn_t db_simple_pager;
+
/* Scare the user with backtrace of curthread to console. */
void db_print_backtrace(void);
More information about the p4-projects
mailing list