git: 7f04c09fe745 - main - rc.subr: Fix wait_for_pids
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Fri, 01 Aug 2025 23:13:03 UTC
The branch main has been updated by des:
URL: https://cgit.FreeBSD.org/src/commit/?id=7f04c09fe74535c1646a4af120f8f1342fe1c328
commit 7f04c09fe74535c1646a4af120f8f1342fe1c328
Author: Dag-Erling Smørgrav <des@FreeBSD.org>
AuthorDate: 2025-08-01 23:11:40 +0000
Commit: Dag-Erling Smørgrav <des@FreeBSD.org>
CommitDate: 2025-08-01 23:11:57 +0000
rc.subr: Fix wait_for_pids
It looks like this function was intended to loop and print an update
whenever at least one of the waited-for processes terminates. However,
the default behavior of pwait is to block until none of the watched
processes exist. Use pwait -o instead so it only blocks until at least
one process terminates, and add a test.
Sponsored by: Klara, Inc.
Sponsored by: NetApp, Inc.
Reviewed by: siderop1_netapp.com, kevans
Differential Revision: https://reviews.freebsd.org/D51691
---
libexec/rc/rc.subr | 4 ++--
libexec/rc/tests/rc_subr_test.sh | 27 +++++++++++++++++++++++++++
2 files changed, 29 insertions(+), 2 deletions(-)
diff --git a/libexec/rc/rc.subr b/libexec/rc/rc.subr
index a2e2e98a5087..06b1bd51384c 100644
--- a/libexec/rc/rc.subr
+++ b/libexec/rc/rc.subr
@@ -800,7 +800,7 @@ wait_for_pids()
fi
_prefix=
while true; do
- _nlist="";
+ _nlist=""
for _j in $_list; do
if kill -0 $_j 2>/dev/null; then
_nlist="${_nlist}${_nlist:+ }$_j"
@@ -813,7 +813,7 @@ wait_for_pids()
_list=$_nlist
echo -n ${_prefix:-"Waiting for PIDS: "}$_list
_prefix=", "
- pwait $_list 2>/dev/null
+ pwait -o $_list 2>/dev/null
done
if [ -n "$_prefix" ]; then
echo "."
diff --git a/libexec/rc/tests/rc_subr_test.sh b/libexec/rc/tests/rc_subr_test.sh
index 9931389e7a02..e8398c8d9b12 100644
--- a/libexec/rc/tests/rc_subr_test.sh
+++ b/libexec/rc/tests/rc_subr_test.sh
@@ -1,5 +1,8 @@
+#-
+# SPDX-License-Identifier: BSD-2-Clause
#
# Copyright 2022 Mateusz Piotrowski <0mp@FreeBSD.org>
+# Copyright (c) 2025 Klara, Inc.
#
# SPDX-License-Identifier: BSD-2-Clause
#
@@ -104,8 +107,32 @@ oomprotect_yes_body()
/bin/sh "$__script" "$__name" "$__pidfile" onestop
}
+atf_test_case wait_for_pids_progress
+wait_for_pids_progress_head()
+{
+ atf_set "descr" "Verify that wait_for_pids prints progress updates"
+}
+wait_for_pids_progress_body()
+{
+ cat >>script <<'EOF'
+. /etc/rc.subr
+sleep 15 &
+a=$!
+sleep 10 &
+b=$!
+sleep 5 &
+c=$!
+wait_for_pids $a $b $c
+EOF
+ re="^Waiting for PIDS: [0-9]+ [0-9]+ [0-9]+"
+ re="${re}, [0-9]+ [0-9]+"
+ re="${re}, [0-9]+\.$"
+ atf_check -s exit:0 -o match:"${re}" /bin/sh script
+}
+
atf_init_test_cases()
{
atf_add_test_case oomprotect_all
atf_add_test_case oomprotect_yes
+ atf_add_test_case wait_for_pids_progress
}