Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 21 Apr 2025 03:19:27 GMT
From:      Kyle Evans <kevans@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: df1b0f580d3d - main - time: switch to fences for siginfo_recvd
Message-ID:  <202504210319.53L3JRSL006544@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by kevans:

URL: https://cgit.FreeBSD.org/src/commit/?id=df1b0f580d3dc4dd165d84fbcc14d0eebd8ee2c4

commit df1b0f580d3dc4dd165d84fbcc14d0eebd8ee2c4
Author:     Kyle Evans <kevans@FreeBSD.org>
AuthorDate: 2025-04-21 03:19:17 +0000
Commit:     Kyle Evans <kevans@FreeBSD.org>
CommitDate: 2025-04-21 03:19:17 +0000

    time: switch to fences for siginfo_recvd
    
    This effectively reverts
    6e824f3713011 ("time: siginfo_recvd needs to be marked volatile")
    because it was actually wrong.  Switch to C11 signal fence, which
    provides a compiler barrier that will do the right thing.
    
    Reported by:    kib
    Reviewed by:    kib (slightly earlier version)
    Differential Revision:  https://reviews.freebsd.org/D45574
---
 usr.bin/time/time.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/usr.bin/time/time.c b/usr.bin/time/time.c
index 4c1ce06543e3..5478b23d52ec 100644
--- a/usr.bin/time/time.c
+++ b/usr.bin/time/time.c
@@ -40,6 +40,8 @@
 #include <errno.h>
 #include <locale.h>
 #include <signal.h>
+#include <stdatomic.h>
+#include <stdbool.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <stdint.h>
@@ -54,7 +56,7 @@ static void showtime(FILE *, struct timespec *, struct timespec *,
 static void siginfo(int);
 static void usage(void) __dead2;
 
-static volatile sig_atomic_t siginfo_recvd;
+static sig_atomic_t siginfo_recvd;
 static char decimal_point;
 static struct timespec before_ts;
 static int hflag, pflag;
@@ -125,7 +127,10 @@ main(int argc, char **argv)
 	(void)signal(SIGINFO, siginfo);
 	(void)siginterrupt(SIGINFO, 1);
 	while (wait4(pid, &status, 0, &ru) != pid) {
-		if (siginfo_recvd) {
+		bool do_siginfo = siginfo_recvd != 0;
+
+		atomic_signal_fence(memory_order_acquire);
+		if (do_siginfo) {
 			siginfo_recvd = 0;
 			if (clock_gettime(CLOCK_MONOTONIC, &after))
 				err(1, "clock_gettime");
@@ -296,4 +301,5 @@ siginfo(int sig __unused)
 {
 
 	siginfo_recvd = 1;
+	atomic_signal_fence(memory_order_release);
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202504210319.53L3JRSL006544>