From 3c69031ad5d1941c1381c14f5de6d70dd118c1de Mon Sep 17 00:00:00 2001 From: Diomidis Spinellis Date: Sat, 3 Aug 2024 16:34:29 +0300 Subject: [PATCH] Improve atomic write probability The previous atomic write implementation, based on disabling I/O buffering yielded multiple 8192 byte write(2) calls for a single print in Perl v5.36.0. --- src/csmake.pl | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/src/csmake.pl b/src/csmake.pl index 2885649..896d009 100755 --- a/src/csmake.pl +++ b/src/csmake.pl @@ -351,13 +351,10 @@ sub spy # my $rulesfile = "$ENV{CSCOUT_SPY_TMPDIR}/rules"; -open(RULES, ">>", $rulesfile) || die "Unable to open $rulesfile: $!\n"; -# Disable buffering to avoid (for POSIX-compliant filesystems) garbled output +# Use syswrite to avoid (for POSIX-compliant filesystems) garbled output # from concurrent spy executions -my $ofh = select RULES; -$| = 1; -select $ofh; +open(RULES, ">>", $rulesfile) || die "Unable to open $rulesfile: $!\n"; # String to accumulate rules, so that they can be written with an atomic write my $rules; @@ -484,7 +481,7 @@ sub ancestor $rules .= "END AR\n"; } -print RULES $rules; +syswrite(RULES, $rules); close(RULES); # Finally, execute the real ar @@ -693,7 +690,7 @@ sub ancestor $rules .= "END LINK\n"; } -print RULES $rules; +syswrite(RULES, $rules); close(RULES); # Finally, execute the real gcc @@ -777,7 +774,7 @@ sub abs_if_exists $rules .= "END LINK\n"; } -print RULES $rules; +syswrite(RULES, $rules); close(RULES); # Finally, execute the real ld @@ -813,7 +810,7 @@ sub abs_if_exists } } -print RULES $rules; +syswrite(RULES, $rules); close(RULES); # Finally, execute the real mv @@ -872,7 +869,7 @@ sub abs_if_exists } } -print RULES $rules; +syswrite(RULES, $rules); close(RULES); # Finally, execute the real install