[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
move-if-change and parallel make
From: |
Ralf Wildenhues |
Subject: |
move-if-change and parallel make |
Date: |
Sat, 22 Jan 2011 17:03:15 +0100 |
User-agent: |
Mutt/1.5.20 (2010-08-04) |
A small poll: can anybody confirm whether something like this:
while touch a b; mv -f a c & mv -f b c & wait; do :; done
can ever fail with EBUSY from rename(2), say, on an SMP system on NFS
or in some other weird setup? Can it fail on w32? Or with some Linux
kernel versions only?
Asking because this failure report:
http://sourceware.org/ml/binutils/2010-12/msg00086.html
http://sourceware.org/bugzilla/show_bug.cgi?id=12283
would benefit from a patch like below in this case. The CMPPROG
interface is the same as what install-sh uses. I'm assuming the
slight inefficiency going from 'cmp -s' to cmp is not a problem.
Or is all of this totally overkill here?
Thanks,
Ralf
move-if-change: cope with concurrent mv of identical file.
* build-aux/move-if-change (CMPPROG): Accept environment
variable as an override for `cmp'.
(usage): Document CMPPROG.
Adjust comparison to drop stdout. Cope with failure of mv if
the target file exists and is identical to the source, for
parallel builds.
Report from H.J. Lu against binutils in PR binutils/12283.
diff --git a/build-aux/move-if-change b/build-aux/move-if-change
index a891ca5..a15b915 100755
--- a/build-aux/move-if-change
+++ b/build-aux/move-if-change
@@ -2,7 +2,7 @@
# Like mv $1 $2, but if the files are the same, just delete $1.
# Status is zero if successful, nonzero otherwise.
-VERSION='2007-09-28 23:10'; # UTC
+VERSION='2011-01-22 15:40'; # UTC
# The definition above must lie within the first 8 lines in order
# for the Emacs time-stamp write hook (at end) to update it.
# If you change this file with Emacs, please let the write hook
@@ -32,6 +32,8 @@ If SOURCE is different than DEST, then move it to DEST; else
remove SOURCE.
--help display this help and exit
--version output version information and exit
+The variable CMPPROG can be used to specify an alternative to \`cmp'.
+
Report bugs to <address@hidden>."
version=`expr "$VERSION" : '\([^ ]*\)'`
@@ -41,6 +43,7 @@ License GPLv3+: GNU GPL version 3 or later
<http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law."
+cmpprog=${CMPPROG-cmp}
for arg
do
@@ -60,12 +63,15 @@ do
esac
done
-test $# = 2 || { echo "$0: $usage" >&2; exit 1; }
+test $# -eq 2 || { echo "$0: $usage" >&2; exit 1; }
-if test -r "$2" && cmp -s -- "$1" "$2"; then
+if test -r "$2" && $cmpprog -- "$1" "$2" >/dev/null; then
rm -f -- "$1"
else
- mv -f -- "$1" "$2"
+ if mv -f -- "$1" "$2"; then :; else
+ # Ignore failure due to a concurrent move-if-change.
+ $cmpprog "$1" "$2" >/dev/null 2>&1 && rm -f -- "$1"
+ fi
fi
## Local Variables:
- move-if-change and parallel make,
Ralf Wildenhues <=