[PATCH 2/3] provide a facility for "delayed" progress reporting

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxx>
---
 progress.c |   34 ++++++++++++++++++++++++++++++++++
 progress.h |    6 ++++++
 2 files changed, 40 insertions(+), 0 deletions(-)

diff --git a/progress.c b/progress.c
index 478134b..05f7890 100644
--- a/progress.c
+++ b/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();
diff --git a/progress.h b/progress.h
index 1f2661e..4ee851a 100644
--- a/progress.h
+++ b/progress.h
@@ -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
-- 
1.5.1.1.874.g4f52f-dirty

-
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]