Bladeren bron

[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 jaren geleden
bovenliggende
commit
6bd0060f26
2 gewijzigde bestanden met toevoegingen van 37 en 3 verwijderingen
  1. 36
    3
      src/core/timer.c
  2. 1
    0
      src/include/ipxe/timer.h

+ 36
- 3
src/core/timer.c Bestand weergeven

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
  * @v secs		Number of seconds for which to delay
95
  * @v secs		Number of seconds for which to delay
96
+ * @v interrupted	Interrupt checking method, or NULL
96
  * @ret secs		Number of seconds remaining, if interrupted
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
 	unsigned long start = currticks();
101
 	unsigned long start = currticks();
100
 	unsigned long now;
102
 	unsigned long now;
101
 
103
 
102
 	for ( ; secs ; secs-- ) {
104
 	for ( ; secs ; secs-- ) {
103
 		while ( ( ( now = currticks() ) - start ) < TICKS_PER_SEC ) {
105
 		while ( ( ( now = currticks() ) - start ) < TICKS_PER_SEC ) {
104
 			step();
106
 			step();
105
-			if ( iskey() && ( getchar() == CTRL_C ) )
107
+			if ( interrupted && interrupted() )
106
 				return secs;
108
 				return secs;
107
 			cpu_nap();
109
 			cpu_nap();
108
 		}
110
 		}
112
 	return 0;
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
  * Find a working timer
149
  * Find a working timer
117
  *
150
  *

+ 1
- 0
src/include/ipxe/timer.h Bestand weergeven

75
 extern void mdelay ( unsigned long msecs );
75
 extern void mdelay ( unsigned long msecs );
76
 extern unsigned long currticks ( void );
76
 extern unsigned long currticks ( void );
77
 extern unsigned int sleep ( unsigned int seconds );
77
 extern unsigned int sleep ( unsigned int seconds );
78
+extern void sleep_fixed ( unsigned int secs );
78
 
79
 
79
 #endif /* _IPXE_TIMER_H */
80
 #endif /* _IPXE_TIMER_H */

Laden…
Annuleren
Opslaan