david/ipxe
david
/
ipxe
Archived
1
0
Fork 0

[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>
This commit is contained in:
Michael Brown 2017-09-05 23:21:34 +01:00
parent 97f0f56a34
commit 7e6b367b7e
1 changed files with 15 additions and 13 deletions

View File

@ -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,26 +81,28 @@ 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 ) {
if ( iskey() ) {
key = getchar();
if ( key == CTRL_C ) {
monojob_rc = -ECANCELED;
break;
}
elapsed = ( now - last_check );
if ( ! elapsed )
continue;
last_check = now;
/* Check for keypresses */
if ( iskey() ) {
key = getchar();
if ( key == CTRL_C ) {
monojob_rc = -ECANCELED;
break;
}
last_keycheck = now;
}
/* Monitor progress */