|  | @@ -90,19 +90,21 @@ void mdelay ( unsigned long msecs ) {
 | 
		
	
		
			
			| 90 | 90 |  }
 | 
		
	
		
			
			| 91 | 91 |  
 | 
		
	
		
			
			| 92 | 92 |  /**
 | 
		
	
		
			
			| 93 |  | - * Sleep (interruptibly) for a fixed number of seconds
 | 
		
	
		
			
			|  | 93 | + * Sleep (possibly interruptibly) for a fixed number of seconds
 | 
		
	
		
			
			| 94 | 94 |   *
 | 
		
	
		
			
			| 95 | 95 |   * @v secs		Number of seconds for which to delay
 | 
		
	
		
			
			|  | 96 | + * @v interrupted	Interrupt checking method, or NULL
 | 
		
	
		
			
			| 96 | 97 |   * @ret secs		Number of seconds remaining, if interrupted
 | 
		
	
		
			
			| 97 | 98 |   */
 | 
		
	
		
			
			| 98 |  | -unsigned int sleep ( unsigned int secs ) {
 | 
		
	
		
			
			|  | 99 | +static unsigned int sleep_interruptible ( unsigned int secs,
 | 
		
	
		
			
			|  | 100 | +					  int ( * interrupted ) ( void ) ) {
 | 
		
	
		
			
			| 99 | 101 |  	unsigned long start = currticks();
 | 
		
	
		
			
			| 100 | 102 |  	unsigned long now;
 | 
		
	
		
			
			| 101 | 103 |  
 | 
		
	
		
			
			| 102 | 104 |  	for ( ; secs ; secs-- ) {
 | 
		
	
		
			
			| 103 | 105 |  		while ( ( ( now = currticks() ) - start ) < TICKS_PER_SEC ) {
 | 
		
	
		
			
			| 104 | 106 |  			step();
 | 
		
	
		
			
			| 105 |  | -			if ( iskey() && ( getchar() == CTRL_C ) )
 | 
		
	
		
			
			|  | 107 | +			if ( interrupted && interrupted() )
 | 
		
	
		
			
			| 106 | 108 |  				return secs;
 | 
		
	
		
			
			| 107 | 109 |  			cpu_nap();
 | 
		
	
		
			
			| 108 | 110 |  		}
 | 
		
	
	
		
			
			|  | @@ -112,6 +114,37 @@ unsigned int sleep ( unsigned int secs ) {
 | 
		
	
		
			
			| 112 | 114 |  	return 0;
 | 
		
	
		
			
			| 113 | 115 |  }
 | 
		
	
		
			
			| 114 | 116 |  
 | 
		
	
		
			
			|  | 117 | +/**
 | 
		
	
		
			
			|  | 118 | + * Check if sleep has been interrupted by keypress
 | 
		
	
		
			
			|  | 119 | + *
 | 
		
	
		
			
			|  | 120 | + * @ret interrupted	Sleep has been interrupted
 | 
		
	
		
			
			|  | 121 | + */
 | 
		
	
		
			
			|  | 122 | +static int keypress_interrupted ( void ) {
 | 
		
	
		
			
			|  | 123 | +
 | 
		
	
		
			
			|  | 124 | +	return ( iskey() && ( getchar() == CTRL_C ) );
 | 
		
	
		
			
			|  | 125 | +}
 | 
		
	
		
			
			|  | 126 | +
 | 
		
	
		
			
			|  | 127 | +/**
 | 
		
	
		
			
			|  | 128 | + * Sleep (interruptibly) for a fixed number of seconds
 | 
		
	
		
			
			|  | 129 | + *
 | 
		
	
		
			
			|  | 130 | + * @v secs		Number of seconds for which to delay
 | 
		
	
		
			
			|  | 131 | + * @ret secs		Number of seconds remaining, if interrupted
 | 
		
	
		
			
			|  | 132 | + */
 | 
		
	
		
			
			|  | 133 | +unsigned int sleep ( unsigned int secs ) {
 | 
		
	
		
			
			|  | 134 | +
 | 
		
	
		
			
			|  | 135 | +	return sleep_interruptible ( secs, keypress_interrupted );
 | 
		
	
		
			
			|  | 136 | +}
 | 
		
	
		
			
			|  | 137 | +
 | 
		
	
		
			
			|  | 138 | +/**
 | 
		
	
		
			
			|  | 139 | + * Sleep (uninterruptibly) for a fixed number of seconds
 | 
		
	
		
			
			|  | 140 | + *
 | 
		
	
		
			
			|  | 141 | + * @v secs		Number of seconds for which to delay
 | 
		
	
		
			
			|  | 142 | + */
 | 
		
	
		
			
			|  | 143 | +void sleep_fixed ( unsigned int secs ) {
 | 
		
	
		
			
			|  | 144 | +
 | 
		
	
		
			
			|  | 145 | +	sleep_interruptible ( secs, NULL );
 | 
		
	
		
			
			|  | 146 | +}
 | 
		
	
		
			
			|  | 147 | +
 | 
		
	
		
			
			| 115 | 148 |  /**
 | 
		
	
		
			
			| 116 | 149 |   * Find a working timer
 | 
		
	
		
			
			| 117 | 150 |   *
 |