*/
int monojob_wait ( const char *string, unsigned long timeout ) {
struct job_progress progress;
- unsigned long start;
unsigned long last_keycheck;
unsigned long last_progress;
+ unsigned long last_display;
unsigned long now;
unsigned long elapsed;
- unsigned long completed;
- unsigned long total;
+ unsigned long completed = 0;
+ unsigned long scaled_completed;
+ unsigned long scaled_total;
unsigned int percentage;
int shown_percentage = 0;
int ongoing_rc;
if ( string )
printf ( "%s...", string );
monojob_rc = -EINPROGRESS;
- last_keycheck = last_progress = start = currticks();
+ last_keycheck = last_progress = last_display = currticks();
while ( monojob_rc == -EINPROGRESS ) {
/* Allow job to progress */
/* Monitor progress */
ongoing_rc = job_progress ( &monojob, &progress );
+ /* Reset timeout if progress has been made */
+ if ( completed != progress.completed )
+ last_progress = now;
+ completed = progress.completed;
+
/* Check for timeout, if applicable */
- elapsed = ( now - start );
+ elapsed = ( now - last_progress );
if ( timeout && ( elapsed >= timeout ) ) {
monojob_rc = ( ongoing_rc ? ongoing_rc : -ETIMEDOUT );
break;
}
/* Display progress, if applicable */
- elapsed = ( now - last_progress );
+ elapsed = ( now - last_display );
if ( string && ( elapsed >= TICKS_PER_SEC ) ) {
if ( shown_percentage )
printf ( "\b\b\b\b \b\b\b\b" );
/* Normalise progress figures to avoid overflow */
- completed = ( progress.completed / 128 );
- total = ( progress.total / 128 );
- if ( total ) {
- percentage = ( ( 100 * completed ) / total );
+ scaled_completed = ( progress.completed / 128 );
+ scaled_total = ( progress.total / 128 );
+ if ( scaled_total ) {
+ percentage = ( ( 100 * scaled_completed ) /
+ scaled_total );
printf ( "%3d%%", percentage );
shown_percentage = 1;
} else {
printf ( "." );
shown_percentage = 0;
}
- last_progress = now;
+ last_display = now;
}
}
rc = monojob_rc;