Eric Blake <ebb9 <at> byu.net> writes: > > As reported by various people, most recently by Bruce Dugan, the autoconf > testsuite has spurious failures on MacOS 10.5, where readdir intermittently > lists a file more than once in the face of a rapidly changing directory.
What do people think of this followup patch? Is 'ls -1' really non-portable, or is the manual missing '1' from its list of portable options? Is there any known ls where 'ls -1 | blah' and 'ls | blah' behave differently? Also, does this attempt to shave processes in the autoconf testsuite look valid? [Lest you get a mistaken idea about my abilities, my sed-foo isn't that strong: I had to copy liberally from the 'info sed' manual.] From: Eric Blake <[EMAIL PROTECTED]> Date: Tue, 2 Dec 2008 11:51:44 -0700 Subject: [PATCH] Improve AC_STATE_SAVE. * tests/local.at (AC_STATE_SAVE): Avoid ls -1, use one less process by hoisting the uniqueness check into sed. * doc/autoconf.texi (Limitations of Usual Tools) <ls>: Mention MacOS bug. Signed-off-by: Eric Blake <[EMAIL PROTECTED]> --- ChangeLog | 6 ++++++ doc/autoconf.texi | 10 ++++++++++ tests/local.at | 16 ++++++++++++++-- 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 7ca53e9..e585861 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ 2008-12-02 Eric Blake <[EMAIL PROTECTED]> + Improve AC_STATE_SAVE. + * tests/local.at (AC_STATE_SAVE): Avoid ls -1, use one less + process by hoisting the uniqueness check into sed. + * doc/autoconf.texi (Limitations of Usual Tools) <ls>: Mention + MacOS bug. + Avoid MacOS readdir bug in testsuite. * tests/local.at (AC_STATE_SAVE): Avoid spurious failures due to duplicated ls entries. diff --git a/doc/autoconf.texi b/doc/autoconf.texi index 1decd4b..fe28f39 100644 --- a/doc/autoconf.texi +++ b/doc/autoconf.texi @@ -16575,6 +16575,16 @@ Limitations of Usual Tools @samp{.c} files. This is no longer a practical problem, since current @command{ls} implementations send diagnostics to standard error. +The behavior of @command{ls} on a directory that is being concurrently +modified is not always predictable, because of a data race where cached +information returned by @code{readdir} does not match the current +directory state. In fact, MacOS 10.5 has an intermittent bug where [EMAIL PROTECTED], and thus @command{ls}, sometimes lists a file more than +once if other files were added or removed from the directory immediately +prior to the @command{ls} call. Since @command{ls} already sorts its +output, the duplicate entries can be avoided by piping the results +through @code{uniq}. + @anchor{mkdir} @item @command{mkdir} @c ------------------ diff --git a/tests/local.at b/tests/local.at index 2ec7bc5..fa9cef1 100644 --- a/tests/local.at +++ b/tests/local.at @@ -197,11 +197,23 @@ m4_define([AT_CONFIGURE_AC], # confirm that no test modifies variables outside the Autoconf namespace or # leaves temporary files. AT_CONFIG_CMP uses the variable dumps to confirm that # tests have the same side effects regardless of caching. -# The sort -u is necessary, since MacOS 10.5 has a bug where readdir can +# The sed script duplicates uniq functionality (thanks to 'info sed' for +# the recipe), to avoid a MacOS 10.5 has a bug where readdir can # list a file multiple times in a rapidly changing directory. m4_defun([AC_STATE_SAVE], [(set) 2>&1 | sort >state-env.$][1 -ls -1 | sed '/^at-/d;/^state-/d;/^config\./d' | sort -u >state-ls.$][1 +ls | sed '/^at-/d;/^state-/d;/^config\./d + h + :b + $b + N + /^\(.*\)\n\1$/ { + g + bb + } + $b + P + D' >state-ls.$][1 ])# AC_STATE_SAVE ]]) -- 1.6.0.4