Pause on console in libmisc/shell detecting terminal size (mvme5500, beatnik)

Peter Dufault dufault at hda.com
Fri Jan 5 20:56:27 UTC 2024



> On Jan 5, 2024, at 1:36 PM, Peter Dufault <dufault at hda.com> wrote:
> 
> I "#if 0"d out the call to "rtems_shell_term_row_column_swapped()" that checks for a broken "tmux" terminal.  That is what sends "\033[>0q" to the console.  I no longer see "0q" on the console but there is still a long pause before the command is executed.
> 
> Does it make sense to check the shell's terminal for its size before executing every command?  It could be checked once, or the check could be moved into its own command.  Now the shell checks for the terminal size and if it is a "tmux" terminal before it calls every command.
> 
> The escape sequence does work on gnome-terminal, so I'm not sure what causes the delay. I can investigate that, but question if this
> should be done in the shell.

There's a bug detecting the timeout in rtems_shell_term_wait_for().  It does this:

  int msec = 150;
  while (msec-- > 0  && str[i] != '\0') {
    /* Do stuff. */
    if (nothing_arrived()) {
       usleep(1000);
    }
  }

  if (msec == 0) {
    /* BUG when we broke from the loop due to time out msec is -1, not 0. */
  }

so if nothing comes in it treats it like it found a match, and for some reason nothing is coming in.

The "telnetd01" test I'm running doesn't set CONFIGURE_MICROSECONDS_PER_TICK so I think the default is 10000 us.  That means we call usleep(1000) 150 times when no data arrives.  If usleep() delays for one clock tick then that is 150 * .01 or 1.5 seconds.  Since the code times out twice that's three seconds.  Actually it used to timeout in 4.5 seconds before I disabled the call to rtems_shell_term_row_column_swapped() - that function is called even when the calls to get the lines and columns fails.

I changed the code to use VTIME of 1 (1/10 second, or 100 msec) instead of 0.   That lets TERMIOS do the character arrival timeout instead of using a delay in a loop that resets - essentially duplicating VTIME != 0 VMIN == 0.  Once I did that it times out as I expect in .1 seconds.

I don't know WHY no characters arrive but I know why it has a long delay.

Peter
-----------------
Peter Dufault
HD Associates, Inc.      Software and System Engineering





More information about the devel mailing list