diff options
author | Igor Pashev <pashev.igor@gmail.com> | 2015-07-04 17:13:50 +0300 |
---|---|---|
committer | Igor Pashev <pashev.igor@gmail.com> | 2015-07-04 17:13:50 +0300 |
commit | 71cd8e3a743046573744123777061b64881bf372 (patch) | |
tree | 82522befe647f4fff186a5630cad0cad33f8ef53 /tests/tail-2/inotify-race.sh | |
parent | c18578632fd3c9e513e613a86ba2b7c4ebee6c45 (diff) | |
download | coreutils-upstream.tar.gz |
Imported Upstream version 8.24upstream/8.24upstream
Diffstat (limited to 'tests/tail-2/inotify-race.sh')
-rwxr-xr-x | tests/tail-2/inotify-race.sh | 55 |
1 files changed, 40 insertions, 15 deletions
diff --git a/tests/tail-2/inotify-race.sh b/tests/tail-2/inotify-race.sh index c25f354a..4ce05083 100755 --- a/tests/tail-2/inotify-race.sh +++ b/tests/tail-2/inotify-race.sh @@ -5,7 +5,7 @@ # indefinitely if no *other* data is appended, but it would be printed as # soon as any additional appended data is detected. -# Copyright (C) 2009-2014 Free Software Foundation, Inc. +# Copyright (C) 2009-2015 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 @@ -23,10 +23,11 @@ . "${srcdir=.}/tests/init.sh"; path_prepend_ ./src print_ver_ tail -# Don't run this test by default because sometimes it's skipped as noted below. -# Also gdb has a bug in Debian's gdb-6.8-3 at least that causes it to not -# cleanup and exit correctly when it receives a SIGTERM, thus hanging the test. -very_expensive_ +# Terminate any background gdb/tail process +cleanup_() { + kill $pid 2>/dev/null && wait $pid + kill $sleep 2>/dev/null && wait $sleep +} touch file || framework_failure_ touch tail.out || framework_failure_ @@ -37,37 +38,61 @@ case $(cat gdb.out) in *) skip_ "can't run gdb";; esac -break_src="$abs_top_builddir/src/tail.c" +# Break on a line rather than a symbol, to cater for inline functions +break_src="$abs_top_srcdir/src/tail.c" break_line=$(grep -n ^tail_forever_inotify "$break_src") || framework_failure_ break_line=$(echo "$break_line" | cut -d: -f1) || framework_failure_ + +# Note we get tail to monitor a background sleep process +# rather than using timeout(1), as timeout sends SIGCONT +# signals to its monitored process, and gdb (7.9 at least) +# has _intermittent_ issues with this. +# Sending SIGCONT resulted in either delayed child termination, +# or no child termination resulting in a hung test. +# See https://sourceware.org/bugzilla/show_bug.cgi?id=18364 + +env sleep 10 & sleep=$! + # See if gdb works and # tail_forever_inotify is compiled and run -timeout 10s gdb -nx --batch-silent \ +gdb -nx --batch-silent \ --eval-command="break $break_line" \ - --eval-command='run -f file' \ + --eval-command="run --pid=$sleep -f file" \ --eval-command='quit' \ - tail < /dev/null > gdb.out 2>&1 || skip_ 'breakpoint not hit' + tail < /dev/null > gdb.out 2>&1 + +kill $sleep || skip_ 'breakpoint not hit' +wait $sleep # FIXME: The above is seen to _intermittently_ fail with: # warning: .dynamic section for "/lib/libc.so.6" is not at the expected address # warning: difference appears to be caused by prelink, adjusting expectations compare /dev/null gdb.out || skip_ "can't set breakpoints in tail" +env sleep 10 & sleep=$! + # Run "tail -f file", stopping to append a line just before # inotify initialization, and then continue. Before the fix, # that just-appended line would never be output. -timeout 10s gdb -nx --batch-silent \ +gdb -nx --batch-silent \ --eval-command="break $break_line" \ - --eval-command='run -f file >> tail.out' \ + --eval-command="run --pid=$sleep -f file >> tail.out" \ --eval-command='shell echo never-seen-with-tail-7.5 >> file' \ --eval-command='continue' \ --eval-command='quit' \ - tail < /dev/null > /dev/null 2>&1 & -pid=$! + tail < /dev/null > /dev/null 2>&1 & pid=$! + +tail --pid=$pid -f tail.out | (read REPLY; kill $pid) + +# gdb has a bug in Debian's gdb-6.8-3 at least that causes it to not +# cleanup and exit correctly when it receives a SIGTERM, but +# killing sleep, should cause the tail process and thus gdb to exit. +kill $sleep +wait $sleep -tail --pid=$pid -f tail.out | (read; kill $pid) +wait $pid -test -s tail.out || fail=1 +compare /dev/null tail.out && fail=1 Exit $fail |