From 812542fbdec0c6a85a669734dca5d0bfe1d734f0 Mon Sep 17 00:00:00 2001 From: Michael Brantley Date: Tue, 1 Apr 2025 09:15:10 +0100 Subject: [PATCH] fix: improve midline-flush tests Observed failed tests for the aarch64-linux build job on hydra.nixos.org: - https://hydra.nixos.org/build/292893102/nixlog/1 I'm confident the usleep() statements within midline-flush.c handles ordering within a single invocation, but the test does demonstrate that it must be possible to schedule overlapping program invocations, where the first flush of a subsequent invocation can be processed in advance of the final flush from a preceding one. This update adds a numeric identifier to each hello() and goodbye() statement, which should help to identify exactly which invocation gets out of order, and also adds a sleep in the main shell loop to make it that much less likely that this race will occur. --- tests/midline-flush.args | 2 +- tests/midline-flush.c | 6 +++--- tests/midline-flush.err | 20 ++++++++++---------- tests/midline-flush.log | 40 ++++++++++++++++++++-------------------- tests/midline-flush.out | 20 ++++++++++---------- 5 files changed, 44 insertions(+), 44 deletions(-) diff --git a/tests/midline-flush.args b/tests/midline-flush.args index f9cb27a..5097348 100644 --- a/tests/midline-flush.args +++ b/tests/midline-flush.args @@ -1 +1 @@ --- sh -c 'for i in `seq 1 10`; do tests/midline-flush; done' +-- sh -c 'for i in `seq 1 10`; do tests/midline-flush $i; sleep 0.01; done' diff --git a/tests/midline-flush.c b/tests/midline-flush.c index 4166be3..719677c 100644 --- a/tests/midline-flush.c +++ b/tests/midline-flush.c @@ -7,10 +7,10 @@ #include #include -#define hello(fd) fprintf(fd, "Hello, %s! ", fd == stdout ? "stdout" : "stderr") -#define goodbye(fd) fprintf(fd, "Goodbye, %s!\n", fd == stdout ? "stdout" : "stderr") +#define hello(fd) fprintf(fd, "%s: Hello, %s! ", argv[1], fd == stdout ? "stdout" : "stderr") +#define goodbye(fd) fprintf(fd, "%s: Goodbye, %s!\n", argv[1], fd == stdout ? "stdout" : "stderr") -int main() { +int main(int argc, char *argv[]) { hello(stdout); hello(stderr); fflush(stdout); diff --git a/tests/midline-flush.err b/tests/midline-flush.err index a677517..c63afac 100644 --- a/tests/midline-flush.err +++ b/tests/midline-flush.err @@ -1,10 +1,10 @@ -Hello, stderr! Goodbye, stderr! -Hello, stderr! Goodbye, stderr! -Hello, stderr! Goodbye, stderr! -Hello, stderr! Goodbye, stderr! -Hello, stderr! Goodbye, stderr! -Hello, stderr! Goodbye, stderr! -Hello, stderr! Goodbye, stderr! -Hello, stderr! Goodbye, stderr! -Hello, stderr! Goodbye, stderr! -Hello, stderr! Goodbye, stderr! +1: Hello, stderr! 1: Goodbye, stderr! +2: Hello, stderr! 2: Goodbye, stderr! +3: Hello, stderr! 3: Goodbye, stderr! +4: Hello, stderr! 4: Goodbye, stderr! +5: Hello, stderr! 5: Goodbye, stderr! +6: Hello, stderr! 6: Goodbye, stderr! +7: Hello, stderr! 7: Goodbye, stderr! +8: Hello, stderr! 8: Goodbye, stderr! +9: Hello, stderr! 9: Goodbye, stderr! +10: Hello, stderr! 10: Goodbye, stderr! diff --git a/tests/midline-flush.log b/tests/midline-flush.log index 5da343b..a102224 100644 --- a/tests/midline-flush.log +++ b/tests/midline-flush.log @@ -1,20 +1,20 @@ -Hello, stderr! Goodbye, stderr! -Hello, stdout! Goodbye, stdout! -Hello, stderr! Goodbye, stderr! -Hello, stdout! Goodbye, stdout! -Hello, stderr! Goodbye, stderr! -Hello, stdout! Goodbye, stdout! -Hello, stderr! Goodbye, stderr! -Hello, stdout! Goodbye, stdout! -Hello, stderr! Goodbye, stderr! -Hello, stdout! Goodbye, stdout! -Hello, stderr! Goodbye, stderr! -Hello, stdout! Goodbye, stdout! -Hello, stderr! Goodbye, stderr! -Hello, stdout! Goodbye, stdout! -Hello, stderr! Goodbye, stderr! -Hello, stdout! Goodbye, stdout! -Hello, stderr! Goodbye, stderr! -Hello, stdout! Goodbye, stdout! -Hello, stderr! Goodbye, stderr! -Hello, stdout! Goodbye, stdout! +1: Hello, stderr! 1: Goodbye, stderr! +1: Hello, stdout! 1: Goodbye, stdout! +2: Hello, stderr! 2: Goodbye, stderr! +2: Hello, stdout! 2: Goodbye, stdout! +3: Hello, stderr! 3: Goodbye, stderr! +3: Hello, stdout! 3: Goodbye, stdout! +4: Hello, stderr! 4: Goodbye, stderr! +4: Hello, stdout! 4: Goodbye, stdout! +5: Hello, stderr! 5: Goodbye, stderr! +5: Hello, stdout! 5: Goodbye, stdout! +6: Hello, stderr! 6: Goodbye, stderr! +6: Hello, stdout! 6: Goodbye, stdout! +7: Hello, stderr! 7: Goodbye, stderr! +7: Hello, stdout! 7: Goodbye, stdout! +8: Hello, stderr! 8: Goodbye, stderr! +8: Hello, stdout! 8: Goodbye, stdout! +9: Hello, stderr! 9: Goodbye, stderr! +9: Hello, stdout! 9: Goodbye, stdout! +10: Hello, stderr! 10: Goodbye, stderr! +10: Hello, stdout! 10: Goodbye, stdout! diff --git a/tests/midline-flush.out b/tests/midline-flush.out index 1d8bdd2..b449163 100644 --- a/tests/midline-flush.out +++ b/tests/midline-flush.out @@ -1,10 +1,10 @@ -Hello, stdout! Goodbye, stdout! -Hello, stdout! Goodbye, stdout! -Hello, stdout! Goodbye, stdout! -Hello, stdout! Goodbye, stdout! -Hello, stdout! Goodbye, stdout! -Hello, stdout! Goodbye, stdout! -Hello, stdout! Goodbye, stdout! -Hello, stdout! Goodbye, stdout! -Hello, stdout! Goodbye, stdout! -Hello, stdout! Goodbye, stdout! +1: Hello, stdout! 1: Goodbye, stdout! +2: Hello, stdout! 2: Goodbye, stdout! +3: Hello, stdout! 3: Goodbye, stdout! +4: Hello, stdout! 4: Goodbye, stdout! +5: Hello, stdout! 5: Goodbye, stdout! +6: Hello, stdout! 6: Goodbye, stdout! +7: Hello, stdout! 7: Goodbye, stdout! +8: Hello, stdout! 8: Goodbye, stdout! +9: Hello, stdout! 9: Goodbye, stdout! +10: Hello, stdout! 10: Goodbye, stdout!