Browse Source

[time] Add sleep_fixed() function to sleep without checking for Ctrl-C

Signed-off-by: Michael Brown <mcb30@ipxe.org>
tags/v1.20.1
Michael Brown 7 years ago
parent
commit
6bd0060f26
2 changed files with 37 additions and 3 deletions
  1. 36
    3
      src/core/timer.c
  2. 1
    0
      src/include/ipxe/timer.h

+ 36
- 3
src/core/timer.c View File

@@ -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
  *

+ 1
- 0
src/include/ipxe/timer.h View File

@@ -75,5 +75,6 @@ extern void udelay ( unsigned long usecs );
75 75
 extern void mdelay ( unsigned long msecs );
76 76
 extern unsigned long currticks ( void );
77 77
 extern unsigned int sleep ( unsigned int seconds );
78
+extern void sleep_fixed ( unsigned int secs );
78 79
 
79 80
 #endif /* _IPXE_TIMER_H */

Loading…
Cancel
Save