mirror of https://github.com/ipxe/ipxe.git
[monojob] Check for job progress only once per timer tick
Checking for job progress is essentially a user interface activity, and can safely be performed only once per timer tick (as is already done with checking for keypresses). Signed-off-by: Michael Brown <mcb30@ipxe.org>pull/66/head
parent
97f0f56a34
commit
7e6b367b7e
|
@ -64,7 +64,7 @@ struct interface monojob = INTF_INIT ( monojob_intf_desc );
|
|||
*/
|
||||
int monojob_wait ( const char *string, unsigned long timeout ) {
|
||||
struct job_progress progress;
|
||||
unsigned long last_keycheck;
|
||||
unsigned long last_check;
|
||||
unsigned long last_progress;
|
||||
unsigned long last_display;
|
||||
unsigned long now;
|
||||
|
@ -81,18 +81,22 @@ int monojob_wait ( const char *string, unsigned long timeout ) {
|
|||
if ( string )
|
||||
printf ( "%s...", string );
|
||||
monojob_rc = -EINPROGRESS;
|
||||
last_keycheck = last_progress = last_display = currticks();
|
||||
last_check = last_progress = last_display = currticks();
|
||||
while ( monojob_rc == -EINPROGRESS ) {
|
||||
|
||||
/* Allow job to progress */
|
||||
step();
|
||||
now = currticks();
|
||||
|
||||
/* Check for keypresses. This can be time-consuming,
|
||||
* so check only once per clock tick.
|
||||
/* Continue until a timer tick occurs (to minimise
|
||||
* time wasted checking for progress and keypresses).
|
||||
*/
|
||||
elapsed = ( now - last_keycheck );
|
||||
if ( elapsed ) {
|
||||
elapsed = ( now - last_check );
|
||||
if ( ! elapsed )
|
||||
continue;
|
||||
last_check = now;
|
||||
|
||||
/* Check for keypresses */
|
||||
if ( iskey() ) {
|
||||
key = getchar();
|
||||
if ( key == CTRL_C ) {
|
||||
|
@ -100,8 +104,6 @@ int monojob_wait ( const char *string, unsigned long timeout ) {
|
|||
break;
|
||||
}
|
||||
}
|
||||
last_keycheck = now;
|
||||
}
|
||||
|
||||
/* Monitor progress */
|
||||
ongoing_rc = job_progress ( &monojob, &progress );
|
||||
|
|
Loading…
Reference in New Issue