Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[libc] Make sleep() interruptible
Signed-off-by: Michael Brown <mcb30@ipxe.org>
  • Loading branch information
mcb30 committed Mar 22, 2016
1 parent 860d590 commit ee3122b
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 17 deletions.
16 changes: 2 additions & 14 deletions src/core/exec.c
Expand Up @@ -36,10 +36,6 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
#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
Expand Down Expand Up @@ -573,8 +569,6 @@ static struct command_descriptor sleep_cmd =
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 */
Expand All @@ -586,14 +580,8 @@ static int sleep_exec ( int argc, char **argv ) {
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;
}
Expand Down
22 changes: 19 additions & 3 deletions src/core/timer.c
Expand Up @@ -24,6 +24,10 @@
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
Expand All @@ -36,12 +40,24 @@ void mdelay ( unsigned long msecs ) {
}

/**
* 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;
}

0 comments on commit ee3122b

Please sign in to comment.