git/list[1] front-page[2] threads[3] people[4] search[5] about
 

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

From
Nicolas Pitre <nico@cam.org>
Date
Apr 20, 2007, 19:05 UTC
Message-ID
<S1767212AbXDTTaU/20070420193020Z+531@vger.kernel.org>

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>
---
 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
Message 1 of 1 in “provide a facility for "delayed" progress reporting”
  1. 2/3 provide a facility for "delayed" progress reportingNicolas Pitre, Apr 20, 2007

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.