Hi Ralf, On Fri, Apr 28, 2006 at 11:52:58AM +0200, Ralf Wildenhues wrote: > - XFile.pm needs a copyright year update (which I can add, when given > OK-to-commit).
Thanks; I added that. > - AFAICS this causes autom4te to continue but exit with an error status. You are correct, but I did not intend to make it do that. We need to use a warning class, not an error. I chose `unsupported'. > The only difference with parallel make is that the message is > adjusted. Is that correct semantics? Wouldn't it be safer to > actually fatal() if we are running under parallel make? > (Take this with a grain of salt; I don't know what I'm talking about.) Good question; yes. I have changed the patch to do that. Of the luxuries of `make -j' and broken locking, users may now pick one. I also tried to improve the added message. > - BTW, is there real-world indication of build tools other than > Automake-created Makefiles that may happen to invoke parallel autom4te > instances, possibly indirectly? By appearances, the sample makefile content in documentation node `Automatic Remaking' can run autoconf and autoheader in parallel. I do not know how many people have copied it. Here is an updated patch. What do you think? 2006-04-28 Noah Misch <[EMAIL PROTECTED]> * lib/Autom4te/XFile.pm (lock): Allow EOPNOTSUPP, besides ENOLCK. Only mention `make -j' when applicable. Only raise fatal errors when `make -j' is involved. Improve error message. diff -Nurp -X dontdiff ac-clean/lib/Autom4te/XFile.pm ac-xfile_lock/lib/Autom4te/XFile.pm --- ac-clean/lib/Autom4te/XFile.pm 2005-05-14 03:00:39.000000000 -0400 +++ ac-xfile_lock/lib/Autom4te/XFile.pm 2006-04-28 23:23:25.000000000 -0400 @@ -1,4 +1,4 @@ -# Copyright (C) 2001, 2003, 2004 Free Software Foundation, Inc. +# Copyright (C) 2001, 2003, 2004, 2006 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -91,6 +91,7 @@ use Errno; use IO::File; use File::Basename; use Autom4te::ChannelDefs; +use Autom4te::Channels qw(msg); use Autom4te::FileUtils; require Exporter; @@ -218,22 +219,26 @@ sub lock my ($fh, $mode) = @_; # Cannot use @_ here. - # On some systems (e.g. GNU/Linux with NFSv2), flock(2) does not work over - # NFS, but Perl prefers that over fcntl(2) if it exists and if - # perl was not built with -Ud_flock. Normally, this problem is harmless, - # so ignore the ENOLCK errors that are reported in that situation, - # However, if the invoker is using "make -j", the problem is not harmless, - # so report it in that case, by inspecting MAKEFLAGS and looking for - # any arguments indicating that the invoker used -j. - # Admittedly this is a bit of a hack. - if (!flock ($fh, $mode) - && (!$!{ENOLCK} - || (exists $ENV{'MAKEFLAGS'} - && " -$ENV{'MAKEFLAGS'}" =~ / (-[BdeikrRsSw]*j|---?jobs)/))) + # Unless explicitly configured otherwise, Perl implements its `flock' with the + # first of flock(2), fcntl(2), or lockf(3) that works. These can fail on + # NFS-backed files, with ENOLCK (GNU/Linux) or EOPNOTSUPP (FreeBSD); we + # usually ignore these errors. If $ENV{MAKEFLAGS} suggests that a parallel + # invocation of GNU `make' has invoked the tool we serve, report all locking + # failures and abort. + # + # On Unicos, flock(2) and fcntl(2) over NFS hang indefinitely when `lockd' is + # not running. NetBSD NFS clients silently grant all locks. We do not + # attempt to defend against these dangers. + if (!flock ($fh, $mode)) { + my $make_j = (exists $ENV{'MAKEFLAGS'} + && " -$ENV{'MAKEFLAGS'}" =~ / (-[BdeikrRsSw]*j|---?jobs)/); + my $note = "\nforgo `make -j' or use a file system that supports locks"; my $file = $fh->name; - fatal ("cannot lock $file with mode $mode " - . "(perhaps you are running make -j on a lame NFS client?): $!"); + + msg ($make_j ? 'fatal' : 'unsupported', + "cannot lock $file with mode $mode: $!" . ($make_j ? $note : "")) + if $make_j or not $!{ENOLCK} || $!{EOPNOTSUPP}; } }