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

[PATCH] Use sigaction and SA_RESTART in read-tree.c; add option in Makefile.

From
Jason Riedy <ejr@eecs.berkeley.edu>
Date
Apr 2, 2006, 22:29 UTC
Message-ID
<17063.1144016974@lotus.CS.Berkeley.EDU>
In-Reply-To
<Pine.LNX.4.64.0604021312510.3050@g5.osdl.org>

Might as well ape the sigaction change in read-tree.c to avoid the same potential problems. The fprintf status output will be overwritten in a second, so don't bother guarding it. Do move the fputc after disabling SIGALRM to ensure we go to the next line, though.

Also add a NO_SA_RESTART option in the Makefile in case someone doesn't have SA_RESTART but does restart (maybe older HP/UX?). We want the builder to chose this specifically in case the system both lacks SA_RESTART and does not restart stdio calls; a compat #define in git-compat-utils.h would silently allow broken systems.

Signed-off-by: Jason Riedy <ejr@cs.berkeley.edu>
---
 Makefile    |    7 +++++++
 read-tree.c |   28 +++++++++++++++++++---------
 2 files changed, 26 insertions(+), 9 deletions(-)
521dc260ea90a23d58a4e920203af5035ca1a673
diff --git a/Makefile b/Makefile
index c79d646..f3b1d49 100644
--- a/Makefile
+++ b/Makefile
@@ -63,6 +63,9 @@
 # Define COLLISION_CHECK below if you believe that SHA1's
 # 1461501637330902918203684832716283019655932542976 hashes do not give you
 # sufficient guarantee that no collisions between objects will ever happen.
+#
+# Define NO_SA_RESTART if your platform does not have SA_RESTART, _AND_ if
+# it automatically restarts interrupted stdio calls.
 
 # Define USE_NSEC below if you want git to care about sub-second file mtimes
 # and ctimes. Note that you need recent glibc (at least 2.2.4) for this, and
@@ -425,6 +428,10 @@
 endif
 ifdef NO_ACCURATE_DIFF
 	ALL_CFLAGS += -DNO_ACCURATE_DIFF
+endif
+
+ifdef NO_SA_RESTART
+	ALL_CFLAGS += -DSA_RESTART=0
 endif
 
 # Shell quote (do not use $(call) to accomodate ancient setups);
diff --git a/read-tree.c b/read-tree.c
index eaff444..4422dbf 100644
--- a/read-tree.c
+++ b/read-tree.c
@@ -273,10 +273,26 @@
 
 static void progress_interval(int signum)
 {
-	signal(SIGALRM, progress_interval);
 	progress_update = 1;
 }
 
+static void setup_progress_signal(void)
+{
+	struct sigaction sa;
+	struct itimerval v;
+
+	memset(&sa, 0, sizeof(sa));
+	sa.sa_handler = progress_interval;
+	sigemptyset(&sa.sa_mask);
+	sa.sa_flags = SA_RESTART;
+	sigaction(SIGALRM, &sa, NULL);
+
+	v.it_interval.tv_sec = 1;
+	v.it_interval.tv_usec = 0;
+	v.it_value = v.it_interval;
+	setitimer(ITIMER_REAL, &v, NULL);
+}
+
 static void check_updates(struct cache_entry **src, int nr)
 {
 	static struct checkout state = {
@@ -289,8 +305,6 @@
 	unsigned last_percent = 200, cnt = 0, total = 0;
 
 	if (update && verbose_update) {
-		struct itimerval v;
-
 		for (total = cnt = 0; cnt < nr; cnt++) {
 			struct cache_entry *ce = src[cnt];
 			if (!ce->ce_mode || ce->ce_flags & mask)
@@ -302,12 +316,8 @@
 			total = 0;
 
 		if (total) {
-			v.it_interval.tv_sec = 1;
-			v.it_interval.tv_usec = 0;
-			v.it_value = v.it_interval;
-			signal(SIGALRM, progress_interval);
-			setitimer(ITIMER_REAL, &v, NULL);
 			fprintf(stderr, "Checking files out...\n");
+			setup_progress_signal();
 			progress_update = 1;
 		}
 		cnt = 0;
@@ -341,8 +351,8 @@
 		}
 	}
 	if (total) {
-		fputc('\n', stderr);
 		signal(SIGALRM, SIG_IGN);
+		fputc('\n', stderr);
 	}
 }
 
-- 
1.3.0.rc1
Previous: Linus TorvaldsNext: Linus Torvalds
Message 13 of 20 in “Solaris cloning woes partly diagnosed”
  1. Junio C HamanoApr 2, 2006
  2. Linus TorvaldsApr 2, 2006
  3. Jason RiedyApr 2, 2006
  4. Linus TorvaldsApr 2, 2006
  5. Linus TorvaldsApr 2, 2006
  6. Jason RiedyApr 2, 2006
  7. Linus TorvaldsApr 2, 2006
  8. 2/2 pack-objects: be incredibly anal about stdio semanticsLinus Torvalds, Apr 2, 2006
  9. Junio C HamanoApr 2, 2006
  10. Linus TorvaldsApr 2, 2006
  11. Jason RiedyApr 2, 2006
  12. Linus TorvaldsApr 2, 2006
  13. Use sigaction and SA_RESTART in read-tree.c; add option in Makefile.Jason Riedy, Apr 2, 2006
  14. Linus TorvaldsApr 3, 2006
  15. Junio C HamanoApr 3, 2006
  16. Linus TorvaldsApr 3, 2006
  17. Linus TorvaldsApr 3, 2006
  18. H. Peter AnvinApr 4, 2006
  19. [RFH] Solaris cloning woes...Junio C Hamano, Apr 4, 2006
  20. Jason RiedyApr 4, 2006

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.