provide a facility for "delayed" progress reporting
This allows for progress to be displayed only if the progress has not reached a specified percentage treshold within a given delay in seconds. Signed-off-by: Nicolas Pitre <nico@cam.org> Signed-off-by: Junio C Hamano <junkio@cox.net>maint
							parent
							
								
									13aaf14825
								
							
						
					
					
						commit
						180a9f2268
					
				
							
								
								
									
										34
									
								
								progress.c
								
								
								
								
							
							
						
						
									
										34
									
								
								progress.c
								
								
								
								
							|  | @ -13,6 +13,8 @@ static void set_progress_signal(void) | |||
| 	struct sigaction sa; | ||||
| 	struct itimerval v; | ||||
|  | ||||
| 	progress_update = 0; | ||||
|  | ||||
| 	memset(&sa, 0, sizeof(sa)); | ||||
| 	sa.sa_handler = progress_interval; | ||||
| 	sigemptyset(&sa.sa_mask); | ||||
|  | @ -35,6 +37,24 @@ static void clear_progress_signal(void) | |||
|  | ||||
| int display_progress(struct progress *progress, unsigned n) | ||||
| { | ||||
| 	if (progress->delay) { | ||||
| 		char buf[80]; | ||||
| 		if (!progress_update || --progress->delay) | ||||
| 			return 0; | ||||
| 		if (progress->total) { | ||||
| 			unsigned percent = n * 100 / progress->total; | ||||
| 			if (percent > progress->delayed_percent_treshold) { | ||||
| 				/* inhibit this progress report entirely */ | ||||
| 				clear_progress_signal(); | ||||
| 				progress->delay = -1; | ||||
| 				progress->total = 0; | ||||
| 				return 0; | ||||
| 			} | ||||
| 		} | ||||
| 		if (snprintf(buf, sizeof(buf), | ||||
| 			     progress->delayed_title, progress->total)) | ||||
| 			fprintf(stderr, "%s\n", buf); | ||||
| 	} | ||||
| 	if (progress->total) { | ||||
| 		unsigned percent = n * 100 / progress->total; | ||||
| 		if (percent != progress->last_percent || progress_update) { | ||||
|  | @ -59,11 +79,25 @@ void start_progress(struct progress *progress, const char *title, | |||
| 	progress->prefix = prefix; | ||||
| 	progress->total = total; | ||||
| 	progress->last_percent = -1; | ||||
| 	progress->delay = 0; | ||||
| 	if (snprintf(buf, sizeof(buf), title, total)) | ||||
| 		fprintf(stderr, "%s\n", buf); | ||||
| 	set_progress_signal(); | ||||
| } | ||||
|  | ||||
| void start_progress_delay(struct progress *progress, const char *title, | ||||
| 			  const char *prefix, unsigned total, | ||||
| 			  unsigned percent_treshold, unsigned delay) | ||||
| { | ||||
| 	progress->prefix = prefix; | ||||
| 	progress->total = total; | ||||
| 	progress->last_percent = -1; | ||||
| 	progress->delayed_percent_treshold = percent_treshold; | ||||
| 	progress->delayed_title = title; | ||||
| 	progress->delay = delay; | ||||
| 	set_progress_signal(); | ||||
| } | ||||
|  | ||||
| void stop_progress(struct progress *progress) | ||||
| { | ||||
| 	clear_progress_signal(); | ||||
|  |  | |||
|  | @ -5,11 +5,17 @@ struct progress { | |||
| 	const char *prefix; | ||||
| 	unsigned total; | ||||
| 	unsigned last_percent; | ||||
| 	unsigned delay; | ||||
| 	unsigned delayed_percent_treshold; | ||||
| 	const char *delayed_title; | ||||
| }; | ||||
|  | ||||
| int display_progress(struct progress *progress, unsigned n); | ||||
| void start_progress(struct progress *progress, const char *title, | ||||
| 		    const char *prefix, unsigned total); | ||||
| void start_progress_delay(struct progress *progress, const char *title, | ||||
| 			  const char *prefix, unsigned total, | ||||
| 			  unsigned percent_treshold, unsigned delay); | ||||
| void stop_progress(struct progress *progress); | ||||
|  | ||||
| #endif | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Nicolas Pitre
						Nicolas Pitre