summaryrefslogtreecommitdiff
path: root/sys/ddb
diff options
context:
space:
mode:
authorJohn Baldwin <jhb@FreeBSD.org>2006-07-12 21:22:44 +0000
committerJohn Baldwin <jhb@FreeBSD.org>2006-07-12 21:22:44 +0000
commit19e9205a23a412d9e48707fc012db23116ccf282 (patch)
treef2aff187736391b024e6cf6f28e95e5708a2d927 /sys/ddb
parent243d8ac855e2702cccf8b7ebd7e3e4d1f570dda4 (diff)
Notes
Diffstat (limited to 'sys/ddb')
-rw-r--r--sys/ddb/db_command.c8
-rw-r--r--sys/ddb/db_output.c69
-rw-r--r--sys/ddb/db_output.h2
-rw-r--r--sys/ddb/db_ps.c14
-rw-r--r--sys/ddb/db_thread.c6
-rw-r--r--sys/ddb/ddb.h7
6 files changed, 47 insertions, 59 deletions
diff --git a/sys/ddb/db_command.c b/sys/ddb/db_command.c
index c15edaa97148..c92d52fa2aff 100644
--- a/sys/ddb/db_command.c
+++ b/sys/ddb/db_command.c
@@ -392,8 +392,9 @@ db_command(last_cmdp, cmd_table)
/*
* Execute the command.
*/
+ db_enable_pager();
(*cmd->fcn)(addr, have_addr, count, modif);
- db_setup_paging(NULL, NULL, -1);
+ db_disable_pager();
if (cmd->flag & CS_SET_DOT) {
/*
@@ -675,16 +676,13 @@ db_stack_trace_all(db_expr_t dummy, boolean_t dummy2, db_expr_t dummy3,
{
struct proc *p;
struct thread *td;
- int quit;
- quit = 0;
- db_setup_paging(db_simple_pager, &quit, db_lines_per_page);
LIST_FOREACH(p, &allproc, p_list) {
FOREACH_THREAD_IN_PROC(p, td) {
db_printf("\nTracing command %s pid %d tid %ld td %p\n",
p->p_comm, p->p_pid, (long)td->td_tid, td);
db_trace_thread(td, -1);
- if (quit)
+ if (db_pager_quit)
return;
}
}
diff --git a/sys/ddb/db_output.c b/sys/ddb/db_output.c
index fccae29db765..e9f0c824c9de 100644
--- a/sys/ddb/db_output.c
+++ b/sys/ddb/db_output.c
@@ -66,15 +66,15 @@ db_expr_t db_tab_stop_width = 8; /* how wide are tab stops? */
((((i) + db_tab_stop_width) / db_tab_stop_width) * db_tab_stop_width)
db_expr_t db_max_width = 79; /* output line width */
db_expr_t db_lines_per_page = 20; /* lines per page */
+volatile int db_pager_quit; /* user requested quit */
static int db_newlines; /* # lines this page */
-static int db_maxlines = -1; /* max lines/page when paging */
-static db_page_calloutfcn_t *db_page_callout = NULL;
-static void *db_page_callout_arg = NULL;
+static int db_maxlines; /* max lines/page when paging */
static int ddb_use_printf = 0;
SYSCTL_INT(_debug, OID_AUTO, ddb_use_printf, CTLFLAG_RW, &ddb_use_printf, 0,
"use printf for all ddb output");
static void db_putchar(int c, void *arg);
+static void db_pager(void);
/*
* Force pending whitespace.
@@ -120,12 +120,10 @@ db_putchar(c, arg)
return;
if (c == '\r' || c == '\n')
db_check_interrupt();
- if (c == '\n' && db_maxlines > 0 && db_page_callout != NULL) {
+ if (c == '\n' && db_maxlines > 0) {
db_newlines++;
- if (db_newlines >= db_maxlines) {
- db_maxlines = -1;
- db_page_callout(db_page_callout_arg);
- }
+ if (db_newlines >= db_maxlines)
+ db_pager();
}
return;
}
@@ -149,12 +147,10 @@ db_putchar(c, arg)
db_output_position = 0;
db_last_non_space = 0;
db_check_interrupt();
- if (db_maxlines > 0 && db_page_callout != NULL) {
+ if (db_maxlines > 0) {
db_newlines++;
- if (db_newlines >= db_maxlines) {
- db_maxlines = -1;
- db_page_callout(db_page_callout_arg);
- }
+ if (db_newlines >= db_maxlines)
+ db_pager();
}
}
else if (c == '\r') {
@@ -181,27 +177,34 @@ db_putchar(c, arg)
}
/*
- * Register callout for providing a pager for output.
+ * Turn on the pager.
*/
void
-db_setup_paging(db_page_calloutfcn_t *callout, void *arg, int maxlines)
+db_enable_pager(void)
{
-
- if (db_page_callout == NULL || callout == NULL || arg ==
- db_page_callout_arg) {
- db_page_callout = callout;
- db_page_callout_arg = arg;
- db_maxlines = maxlines;
+ if (db_maxlines == 0) {
+ db_maxlines = db_lines_per_page;
db_newlines = 0;
+ db_pager_quit = 0;
}
}
/*
- * 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.
+ * Turn off the pager.
*/
void
-db_simple_pager(void *arg)
+db_disable_pager(void)
+{
+ db_maxlines = 0;
+}
+
+/*
+ * A simple paging callout function. It supports several simple more(1)-like
+ * commands as well as a quit command that sets db_pager_quit which db
+ * commands can poll to see if they should terminate early.
+ */
+void
+db_pager(void)
{
int c, done;
@@ -214,20 +217,18 @@ db_simple_pager(void *arg)
case 'j':
case '\n':
/* Just one more line. */
- db_setup_paging(db_simple_pager, arg, 1);
+ db_maxlines = 1;
done++;
break;
case 'd':
/* Half a page. */
- db_setup_paging(db_simple_pager, arg,
- db_lines_per_page / 2);
+ db_maxlines = db_lines_per_page / 2;
done++;
break;
case 'f':
case ' ':
/* Another page. */
- db_setup_paging(db_simple_pager, arg,
- db_lines_per_page);
+ db_maxlines = db_lines_per_page;
done++;
break;
case 'q':
@@ -235,11 +236,10 @@ db_simple_pager(void *arg)
case 'x':
case 'X':
/* Quit */
- if (arg != NULL) {
- *(int *)arg = 1;
- done++;
- break;
- }
+ db_maxlines = 0;
+ db_pager_quit = 1;
+ done++;
+ break;
#if 0
/* FALLTHROUGH */
default:
@@ -248,6 +248,7 @@ db_simple_pager(void *arg)
}
}
db_printf(" \r");
+ db_newlines = 0;
}
/*
diff --git a/sys/ddb/db_output.h b/sys/ddb/db_output.h
index 7615ea67f6cd..480c40d73af8 100644
--- a/sys/ddb/db_output.h
+++ b/sys/ddb/db_output.h
@@ -38,6 +38,8 @@
* Printing routines for kernel debugger.
*/
+void db_disable_pager(void);
+void db_enable_pager(void);
void db_end_line(void);
void db_force_whitespace(void);
int db_print_position(void);
diff --git a/sys/ddb/db_ps.c b/sys/ddb/db_ps.c
index 39dff4c41135..f220de0ec056 100644
--- a/sys/ddb/db_ps.c
+++ b/sys/ddb/db_ps.c
@@ -73,23 +73,21 @@ db_ps(db_expr_t addr, boolean_t hasaddr, db_expr_t count, char *modif)
struct ucred *cred;
struct pgrp *pgrp;
char state[9];
- int np, quit, rflag, sflag, dflag, lflag, wflag;
+ int np, rflag, sflag, dflag, lflag, wflag;
np = nprocs;
- quit = 0;
if (!LIST_EMPTY(&allproc))
p = LIST_FIRST(&allproc);
else
p = &proc0;
- db_setup_paging(db_simple_pager, &quit, db_lines_per_page);
#ifdef __LP64__
db_printf(" pid uid ppid pgrp state wmesg wchan cmd\n");
#else
db_printf(" pid uid ppid pgrp state wmesg wchan cmd\n");
#endif
- while (--np >= 0 && !quit) {
+ while (--np >= 0 && !db_pager_quit) {
if (p == NULL) {
db_printf("oops, ran out of processes early!\n");
break;
@@ -191,7 +189,7 @@ db_ps(db_expr_t addr, boolean_t hasaddr, db_expr_t count, char *modif)
#endif
FOREACH_THREAD_IN_PROC(p, td) {
dumpthread(p, td, p->p_flag & P_HADTHREADS);
- if (quit)
+ if (db_pager_quit)
break;
}
@@ -363,7 +361,7 @@ DB_SHOW_COMMAND(proc, db_show_proc)
{
struct thread *td;
struct proc *p;
- int i, quit;
+ int i;
/* Determine which process to examine. */
if (have_addr)
@@ -371,8 +369,6 @@ DB_SHOW_COMMAND(proc, db_show_proc)
else
p = kdb_thread->td_proc;
- quit = 0;
- db_setup_paging(db_simple_pager, &quit, db_lines_per_page);
db_printf("Process %d (%s) at %p:\n", p->p_pid, p->p_comm, p);
db_printf(" state: ");
switch (p->p_state) {
@@ -411,7 +407,7 @@ DB_SHOW_COMMAND(proc, db_show_proc)
db_printf(" threads: %d\n", p->p_numthreads);
FOREACH_THREAD_IN_PROC(p, td) {
dumpthread(p, td, 1);
- if (quit)
+ if (db_pager_quit)
break;
}
}
diff --git a/sys/ddb/db_thread.c b/sys/ddb/db_thread.c
index a946dd81f3df..13c3878f8ab2 100644
--- a/sys/ddb/db_thread.c
+++ b/sys/ddb/db_thread.c
@@ -93,13 +93,9 @@ db_show_threads(db_expr_t addr, boolean_t hasaddr, db_expr_t cnt, char *mod)
jmp_buf jb;
void *prev_jb;
struct thread *thr;
- int pager_quit;
- db_setup_paging(db_simple_pager, &pager_quit, db_lines_per_page);
-
- pager_quit = 0;
thr = kdb_thr_first();
- while (!pager_quit && thr != NULL) {
+ while (!db_pager_quit && thr != NULL) {
db_printf(" %6ld (%p) ", (long)thr->td_tid, thr);
prev_jb = kdb_jmpbuf(jb);
if (setjmp(jb) == 0) {
diff --git a/sys/ddb/ddb.h b/sys/ddb/ddb.h
index 549e24e0b727..716740bfec40 100644
--- a/sys/ddb/ddb.h
+++ b/sys/ddb/ddb.h
@@ -52,8 +52,6 @@ int DB_CALL(db_expr_t, db_expr_t *, int, db_expr_t[]);
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_FUNC(cmd_name, func_name, db_cmd_set, 0, NULL)
#define DB_SHOW_COMMAND(cmd_name, func_name) \
@@ -85,6 +83,7 @@ extern int db_indent;
extern int db_inst_count;
extern int db_load_count;
extern int db_store_count;
+extern volatile int db_pager_quit;
extern db_expr_t db_radix;
extern db_expr_t db_max_width;
extern db_expr_t db_tab_stop_width;
@@ -118,8 +117,6 @@ int db_readline(char *lstart, int lsize);
void db_restart_at_pc(boolean_t watchpt);
int db_set_variable(db_expr_t value);
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
@@ -149,8 +146,6 @@ db_cmdfcn_t db_trace_until_matching_cmd;
db_cmdfcn_t db_watchpoint_cmd;
db_cmdfcn_t db_write_cmd;
-db_page_calloutfcn_t db_simple_pager;
-
/*
* Command table.
*/