svn commit: r311952 - head/sys/ddb

Julian Elischer julian at elischer.org
Sun Jan 15 05:08:20 UTC 2017


On 15/01/2017 6:06 AM, Mark Johnston wrote:
> 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.

the old DEC machines had (from memory) ^O  which dropped all pending 
output.
Not so useful when there is 2MB of network buffers queued up to you, 
but very useful on
and asr-33 teletype.

>
>> 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