]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[time] Add sleep_fixed() function to sleep without checking for Ctrl-C
authorMichael Brown <mcb30@ipxe.org>
Mon, 27 Mar 2017 12:31:42 +0000 (15:31 +0300)
committerMichael Brown <mcb30@ipxe.org>
Mon, 27 Mar 2017 12:41:22 +0000 (15:41 +0300)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/core/timer.c
src/include/ipxe/timer.h

index 791cdcdbb1674438a91ff077f9a1b3e3d0a7b2b0..24745cef746b59fe6c81453e078c1b14e41c4117 100644 (file)
@@ -90,19 +90,21 @@ void mdelay ( unsigned long msecs ) {
 }
 
 /**
- * Sleep (interruptibly) for a fixed number of seconds
+ * Sleep (possibly interruptibly) for a fixed number of seconds
  *
  * @v secs             Number of seconds for which to delay
+ * @v interrupted      Interrupt checking method, or NULL
  * @ret secs           Number of seconds remaining, if interrupted
  */
-unsigned int sleep ( unsigned int secs ) {
+static unsigned int sleep_interruptible ( unsigned int secs,
+                                         int ( * interrupted ) ( void ) ) {
        unsigned long start = currticks();
        unsigned long now;
 
        for ( ; secs ; secs-- ) {
                while ( ( ( now = currticks() ) - start ) < TICKS_PER_SEC ) {
                        step();
-                       if ( iskey() && ( getchar() == CTRL_C ) )
+                       if ( interrupted && interrupted() )
                                return secs;
                        cpu_nap();
                }
@@ -112,6 +114,37 @@ unsigned int sleep ( unsigned int secs ) {
        return 0;
 }
 
+/**
+ * Check if sleep has been interrupted by keypress
+ *
+ * @ret interrupted    Sleep has been interrupted
+ */
+static int keypress_interrupted ( void ) {
+
+       return ( iskey() && ( getchar() == CTRL_C ) );
+}
+
+/**
+ * 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 ) {
+
+       return sleep_interruptible ( secs, keypress_interrupted );
+}
+
+/**
+ * Sleep (uninterruptibly) for a fixed number of seconds
+ *
+ * @v secs             Number of seconds for which to delay
+ */
+void sleep_fixed ( unsigned int secs ) {
+
+       sleep_interruptible ( secs, NULL );
+}
+
 /**
  * Find a working timer
  *
index e6b95172e27956bd821cba6cbdc1f1bb803a6909..a6dffaf1c3934ff64337408f250287e85ba0e53c 100644 (file)
@@ -75,5 +75,6 @@ extern void udelay ( unsigned long usecs );
 extern void mdelay ( unsigned long msecs );
 extern unsigned long currticks ( void );
 extern unsigned int sleep ( unsigned int seconds );
+extern void sleep_fixed ( unsigned int secs );
 
 #endif /* _IPXE_TIMER_H */