Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 11 additions & 3 deletions src/uu/tail/src/follow/watch.rs
Original file line number Diff line number Diff line change
Expand Up @@ -576,9 +576,17 @@ pub fn follow(mut observer: Observer, settings: &Settings) -> UResult<()> {
// Drain any additional pending events to batch them together.
// This prevents redundant headers when multiple inotify events
// are queued (e.g., after resuming from SIGSTOP).
while let Ok(Ok(event)) = observer.watcher_rx.as_mut().unwrap().receiver.try_recv()
{
process_event(&mut observer, event, settings, &mut paths)?;
// Multiple iterations with spin_loop hints give the notify
// background thread chances to deliver pending events.
for _ in 0..100 {
while let Ok(Ok(event)) =
observer.watcher_rx.as_mut().unwrap().receiver.try_recv()
{
process_event(&mut observer, event, settings, &mut paths)?;
}
// Use both yield and spin hint for broader CPU support
std::thread::yield_now();
std::hint::spin_loop();
}
}
Ok(Err(notify::Error {
Expand Down
1 change: 1 addition & 0 deletions util/gnu-patches/series
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,4 @@ tests_tsort.patch
tests_du_move_dir_while_traversing.patch
test_mkdir_restorecon.patch
error_msg_uniq.diff
tests_tail_overlay_headers.patch
49 changes: 49 additions & 0 deletions util/gnu-patches/tests_tail_overlay_headers.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
--- gnu.orig/tests/tail/overlay-headers.sh 2025-12-07 23:20:20.566198669 +0100
+++ gnu/tests/tail/overlay-headers.sh 2025-12-07 23:20:20.570198688 +0100
@@ -56,26 +56,39 @@

kill -0 $pid || fail=1

-# Wait for 5 initial lines
-retry_delay_ wait4lines_ .1 6 5 || fail=1
+# Wait for 5 initial lines (2 headers + 2 content lines + 1 blank)
+retry_delay_ wait4lines_ .1 6 5 || { echo "Failed waiting for initial 5 lines"; fail=1; }
+
+echo "=== After initial wait, line count: $(countlines_) ==="
+echo "=== Initial output: ===" && cat out && echo "=== End initial output ==="

# Suspend tail so single read() caters for multiple inotify events
-kill -STOP $pid || fail=1
+kill -STOP $pid || { echo "Failed to STOP tail process"; fail=1; }

# Interleave writes to files to generate overlapping inotify events
echo line >> file1 || framework_failure_
echo line >> file2 || framework_failure_
echo line >> file1 || framework_failure_
echo line >> file2 || framework_failure_
+echo "=== Files written, resuming tail ==="

# Resume tail processing
-kill -CONT $pid || fail=1
+kill -CONT $pid || { echo "Failed to CONT tail process"; fail=1; }

-# Wait for 8 more lines
-retry_delay_ wait4lines_ .1 6 13 || fail=1
+# Wait for 8 more lines (should total 13)
+retry_delay_ wait4lines_ .1 6 13 || { echo "Failed waiting for 13 total lines"; fail=1; }

kill $sleep && wait || framework_failure_

-test "$(countlines_)" = 13 || fail=1
+final_count=$(countlines_)
+echo "=== Final line count: $final_count (expected 13) ==="
+
+if test "$final_count" != 13; then
+ echo "=== FAILURE: Expected 13 lines, got $final_count ==="
+ echo "=== Full output content: ==="
+ cat -A out
+ echo "=== End output content ==="
+ fail=1
+fi

Exit $fail
Loading