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