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 sigaction sa; | ||||||
| 	struct itimerval v; | 	struct itimerval v; | ||||||
|  |  | ||||||
|  | 	progress_update = 0; | ||||||
|  |  | ||||||
| 	memset(&sa, 0, sizeof(sa)); | 	memset(&sa, 0, sizeof(sa)); | ||||||
| 	sa.sa_handler = progress_interval; | 	sa.sa_handler = progress_interval; | ||||||
| 	sigemptyset(&sa.sa_mask); | 	sigemptyset(&sa.sa_mask); | ||||||
|  | @ -35,6 +37,24 @@ static void clear_progress_signal(void) | ||||||
|  |  | ||||||
| int display_progress(struct progress *progress, unsigned n) | 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) { | 	if (progress->total) { | ||||||
| 		unsigned percent = n * 100 / progress->total; | 		unsigned percent = n * 100 / progress->total; | ||||||
| 		if (percent != progress->last_percent || progress_update) { | 		if (percent != progress->last_percent || progress_update) { | ||||||
|  | @ -59,11 +79,25 @@ void start_progress(struct progress *progress, const char *title, | ||||||
| 	progress->prefix = prefix; | 	progress->prefix = prefix; | ||||||
| 	progress->total = total; | 	progress->total = total; | ||||||
| 	progress->last_percent = -1; | 	progress->last_percent = -1; | ||||||
|  | 	progress->delay = 0; | ||||||
| 	if (snprintf(buf, sizeof(buf), title, total)) | 	if (snprintf(buf, sizeof(buf), title, total)) | ||||||
| 		fprintf(stderr, "%s\n", buf); | 		fprintf(stderr, "%s\n", buf); | ||||||
| 	set_progress_signal(); | 	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) | void stop_progress(struct progress *progress) | ||||||
| { | { | ||||||
| 	clear_progress_signal(); | 	clear_progress_signal(); | ||||||
|  |  | ||||||
|  | @ -5,11 +5,17 @@ struct progress { | ||||||
| 	const char *prefix; | 	const char *prefix; | ||||||
| 	unsigned total; | 	unsigned total; | ||||||
| 	unsigned last_percent; | 	unsigned last_percent; | ||||||
|  | 	unsigned delay; | ||||||
|  | 	unsigned delayed_percent_treshold; | ||||||
|  | 	const char *delayed_title; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| int display_progress(struct progress *progress, unsigned n); | int display_progress(struct progress *progress, unsigned n); | ||||||
| void start_progress(struct progress *progress, const char *title, | void start_progress(struct progress *progress, const char *title, | ||||||
| 		    const char *prefix, unsigned total); | 		    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); | void stop_progress(struct progress *progress); | ||||||
|  |  | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Nicolas Pitre
						Nicolas Pitre