#include <ipxe/command.h>
#include <ipxe/parseopt.h>
#include <ipxe/settings.h>
-#include <ipxe/console.h>
-#include <ipxe/keys.h>
-#include <ipxe/process.h>
-#include <ipxe/nap.h>
#include <ipxe/shell.h>
/** @file
static int sleep_exec ( int argc, char **argv ) {
struct sleep_options opts;
unsigned int seconds;
- unsigned long start;
- unsigned long delay;
int rc;
/* Parse options */
return rc;
/* Delay for specified number of seconds */
- start = currticks();
- delay = ( seconds * TICKS_PER_SEC );
- while ( ( currticks() - start ) <= delay ) {
- step();
- if ( iskey() && ( getchar() == CTRL_C ) )
- return -ECANCELED;
- cpu_nap();
- }
+ if ( sleep ( seconds ) != 0 )
+ return -ECANCELED;
return 0;
}
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
#include <unistd.h>
+#include <ipxe/process.h>
+#include <ipxe/console.h>
+#include <ipxe/keys.h>
+#include <ipxe/nap.h>
/**
* Delay for a fixed number of milliseconds
}
/**
- * Delay for a fixed number of seconds
+ * Sleep (interruptibly) for a fixed number of seconds
*
* @v secs Number of seconds for which to delay
+ * @ret secs Number of seconds remaining, if interrupted
*/
unsigned int sleep ( unsigned int secs ) {
- while ( secs-- )
- mdelay ( 1000 );
+ unsigned long start = currticks();
+ unsigned long now;
+
+ for ( ; secs ; secs-- ) {
+ while ( ( ( now = currticks() ) - start ) < TICKS_PER_SEC ) {
+ step();
+ if ( iskey() && ( getchar() == CTRL_C ) )
+ return secs;
+ cpu_nap();
+ }
+ start = now;
+ }
+
return 0;
}