[hci] Continue processing while prompting for shell banner
authorGuo-Fu Tseng <cooldavid@cooldavid.org>
Tue, 13 Jul 2010 13:18:47 +0000 (21:18 +0800)
committerMarty Connor <mdc@etherboot.org>
Sun, 1 Aug 2010 19:51:53 +0000 (15:51 -0400)
Currently we do nothing while polling for user input in shell_banner.
This commit modifies shell_bannder to do something similar to what is
done in shell, where we schedule processes while waiting for user
input.

This approach provides two potential improvements:

First:
We increase key responsiveness in shell_banner. It is much more
likely to successfully get into shell than before. Before this
change I sometimes pressed the CTRL_B, but failed to get into
shell. It may have been caused by waiting too long in
mdelay(100).

Second:
When using scripts, if the downloaded image is not bootable,
gPXE exits before it has the opportunity to gracefully close
the TCP connection. This can leave the TCP state of a remote
server as not closed when it should have been.

gPXE waits for user to input for 2 seconds by default before
returning control to BIOS. This commit lets TCP have the
opportunity to gracefully close while waiting for the user to
hit keys in shell_banner.

Referenced: Michael Brown <mcb30@ipxe.org>
Signed-off-by: Guo-Fu Tseng <cooldavid@cooldavid.org>
Commit-message-modified-by: Marty Connor <mdc@etherboot.org>
Signed-off-by: Marty Connor <mdc@etherboot.org>
src/core/getkey.c
src/hci/shell_banner.c
src/include/console.h

index dbd074c..15c57e5 100644 (file)
@@ -38,7 +38,7 @@ FILE_LICENCE ( GPL2_OR_LATER );
  * @v timeout          Timeout period, in ticks
  * @ret character      Character read from console
  */
-static int getchar_timeout ( unsigned long timeout ) {
+int getchar_timeout ( unsigned long timeout ) {
        unsigned long expiry = ( currticks() + timeout );
 
        while ( currticks() < expiry ) {
index 91633eb..6153d85 100644 (file)
@@ -37,10 +37,9 @@ FILE_LICENCE ( GPL2_OR_LATER );
  * @ret        enter_shell             User wants to enter shell
  */
 int shell_banner ( void ) {
-       int enter_shell = 0;
-       int wait_count;
        int key;
 
+       /* Skip prompt if timeout is zero */
        if ( BANNER_TIMEOUT <= 0 )
                return 0;
 
@@ -48,18 +47,10 @@ int shell_banner ( void ) {
        printf ( "\nPress Ctrl-B for the gPXE command line..." );
 
        /* Wait for key */
-       for ( wait_count = 0 ; wait_count < BANNER_TIMEOUT ; wait_count++ ) {
-               if ( iskey() ) {
-                       key = getchar();
-                       if ( key == CTRL_B )
-                               enter_shell = 1;
-                       break;
-               }
-               mdelay(100);
-       }
+       key = getchar_timeout ( ( BANNER_TIMEOUT * TICKS_PER_SEC ) / 10 );
 
        /* Clear the "Press Ctrl-B" line */
        printf ( "\r                                         \r" );
 
-       return enter_shell;
+       return ( key == CTRL_B );
 }
index 62fedf5..49a898b 100644 (file)
@@ -112,6 +112,7 @@ struct console_driver {
 /* Function prototypes */
 
 extern void putchar ( int character );
+extern int getchar_timeout ( unsigned long timeout );
 extern int getchar ( void );
 extern int iskey ( void );
 extern int getkey ( void );