svn commit: r311952 - head/sys/ddb

Mark Johnston markj at freebsd.org
Sat Jan 14 22:06:32 UTC 2017


On Fri, Jan 13, 2017 at 02:51:04PM +1100, Bruce Evans wrote:
> On Thu, 12 Jan 2017, Mark Johnston wrote:
> 
> > Log:
> >  Enable the use of ^C and ^S/^Q in DDB.
> >
> >  This lets one interrupt DDB's output, which is useful if paging is
> >  disabled and the output device is slow.
> 
> This is quite broken.  It removes the code that was necessary for avoiding
> loss of input.

Hi Bruce,

I've reverted this for now. I haven't thought much about how
db_check_interrupt() might losslessly poll the console driver for
ctrl-C, but I do think it's a valuable feature to have - just this
morning I absent-mindedly dumped a 128K-entry KTR ring from a DDB prompt
after having set $lines = 0, and had to wait for quite a while to get
my prompt back.

> 
> > Modified: head/sys/ddb/db_input.c
> > ==============================================================================
> > --- head/sys/ddb/db_input.c	Thu Jan 12 00:09:31 2017	(r311951)
> > +++ head/sys/ddb/db_input.c	Thu Jan 12 00:22:36 2017	(r311952)
> > @@ -63,7 +63,6 @@ static int	db_lhist_nlines;
> > #define	BLANK		' '
> > #define	BACKUP		'\b'
> >
> > -static int	cnmaygetc(void);
> > static void	db_delete(int n, int bwd);
> > static int	db_inputchar(int c);
> > static void	db_putnchars(int c, int count);
> > @@ -291,12 +290,6 @@ db_inputchar(c)
> > 	return (0);
> > }
> >
> > -static int
> > -cnmaygetc()
> > -{
> > -	return (-1);
> > -}
> > -
> 
> BSD never had a usable console API (function) for checking for input.
> cncheckc() is the correct name for such a function.  The actual
> cncheckc() returns any input that it finds.  This is not the main
> problem here.  The input will have to be read here anyway to determine
> what it is.  The problems are that there is no console API at all for
> ungetting characters in the input stream, and this function doesn't
> even use a stub cnungetc(), but drops the input on the floor.  It does
> document this behaviour in a comment, but doesn't say that it is wrong.
> 
> > int
> > db_readline(lstart, lsize)
> > 	char *	lstart;
> > @@ -350,7 +343,7 @@ db_check_interrupt(void)
> > {
> > 	int	c;
> >
> > -	c = cnmaygetc();
> > +	c = cncheckc();
> > 	switch (c) {
> > 	    case -1:		/* no character */
> > 		return;
> 
> The stub function always returns -1, so db_check_interrupt() is turned into
> a no-op.
> 
> db_check_interrupt() now eats the first byte of any input on every call.
> 
> > @@ -361,7 +354,7 @@ db_check_interrupt(void)
> >
> > 	    case CTRL('s'):
> > 		do {
> > -		    c = cnmaygetc();
> > +		    c = cncheckc();
> > 		    if (c == CTRL('c'))
> > 			db_error((char *)0);
> > 		} while (c != CTRL('q'));
> 
> This is now a bad implementation of xon/xoff.  It doesn't support ixany,
> but busy-waits for ^Q or ^C using cncheckc().  It should at least
> busy-wait using cngetc(), since that might be do a smarter busy wait.
> cngetc() is actually only slightly smarter -- it uses busy-waiting too,
> but with cpu_spinwait() in the loop.  This cpu_spinwait() makes little
> difference since cncheckc() tends to be a heavyweight function.  Only
> cpu_spinwait()s in the innermost loops of cncheckc(), if any, are likely
> to have much effect.
> 
> Multiple consoles complicate this a bit.
> 
> db_check_interrupt() is called after every db_putc() of a newline.  So
> the breakage is mainly for type-ahead while writing many lines.

I'll note that type-ahead interacts rather poorly with DDB's behaviour
of repeating the previous command upon reading an empty input line:
entering a carriage return at any point while "show ktr" is working will
cause it to be started again once it's finished.

> 
> Control processing belongs in the lowest level of console drivers, and
> at least the xon/xoff part is very easy to do.  This makes it work for
> contexts like boot messages -- this can only be controlled now by booting
> with -p, which gives something like an automatic ^S after every line,
> but the control characters for this mode are unusual and there is no
> way to get back to -p mode after turning it off or not starting with it.
> 
> [...]


More information about the svn-src-head mailing list