Skip to content

Commit 54daba3

Browse files
authored
Merge pull request #315 from smuppand/audio_pd
Multimedia: fix DSP_AudioPD multi-instance adsprpcd handling + improve PID logging
2 parents 69d01e7 + d2403eb commit 54daba3

2 files changed

Lines changed: 181 additions & 86 deletions

File tree

Runner/suites/Multimedia/DSP_AudioPD/run.sh

Lines changed: 86 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ fi
6767

6868
STARTED_BY_TEST=0
6969
PID=""
70+
PIDS=""
7071

7172
check_adsprpcd_wait_state() {
7273
pid="$1"
@@ -112,9 +113,17 @@ check_adsprpcd_wait_state() {
112113
}
113114

114115
if is_process_running "adsprpcd"; then
115-
log_info "adsprpcd is running"
116-
PID=$(get_one_pid_by_name "adsprpcd" 2>/dev/null || true)
117-
PID=$(sanitize_pid "$PID")
116+
# is_process_running already prints instances/cmdline (for CI debug)
117+
PIDS=$(get_one_pid_by_name "adsprpcd" all 2>/dev/null || true)
118+
119+
# Pick a primary PID for legacy logging (first valid numeric PID)
120+
for p in $PIDS; do
121+
p_clean=$(sanitize_pid "$p")
122+
if [ -n "$p_clean" ]; then
123+
PID="$p_clean"
124+
break
125+
fi
126+
done
118127
else
119128
log_info "adsprpcd is not running"
120129
log_info "Manually starting adsprpcd daemon"
@@ -130,47 +139,102 @@ else
130139
PID=$(get_one_pid_by_name "adsprpcd" 2>/dev/null || true)
131140
PID=$(sanitize_pid "$PID")
132141
fi
142+
143+
# After start, gather all adsprpcd PIDs (if helper supports it)
144+
PIDS=$(get_one_pid_by_name "adsprpcd" all 2>/dev/null || true)
145+
fi
146+
147+
# Fallback if helper returned nothing
148+
if [ -z "$PIDS" ] && [ -n "$PID" ]; then
149+
PIDS="$PID"
133150
fi
134151

135152
log_info "PID is $PID"
136153

137-
if [ -z "$PID" ] || ! wait_pid_alive "$PID" 10; then
138-
log_fail "Failed to start adsprpcd or PID did not become alive"
154+
# Build an "alive" PID list (avoid false failures if a PID disappears)
155+
PIDS_ALIVE=""
156+
alive_count=0
157+
dead_seen=0
158+
for p in $PIDS; do
159+
p_clean=$(sanitize_pid "$p")
160+
if [ -z "$p_clean" ]; then
161+
continue
162+
fi
163+
164+
if wait_pid_alive "$p_clean" 10; then
165+
alive_count=$((alive_count + 1))
166+
if [ -z "$PIDS_ALIVE" ]; then
167+
PIDS_ALIVE="$p_clean"
168+
else
169+
PIDS_ALIVE="$PIDS_ALIVE $p_clean"
170+
fi
171+
else
172+
dead_seen=1
173+
log_warn "adsprpcd PID $p_clean did not become alive"
174+
fi
175+
done
176+
177+
# Only print alive list if something was dropped (avoids duplicate info in normal case)
178+
if [ "$dead_seen" -eq 1 ]; then
179+
log_info "Alive adsprpcd PIDs: $PIDS_ALIVE"
180+
fi
181+
182+
if [ "$alive_count" -le 0 ]; then
183+
log_fail "Failed to start adsprpcd or no alive PID found"
139184
echo "$TESTNAME FAIL" >"$res_file"
140185

141186
# Kill only if we started it and PID is valid
142187
if [ "$STARTED_BY_TEST" -eq 1 ]; then
143-
PID_CLEAN=$(sanitize_pid "$PID")
144-
if [ -n "$PID_CLEAN" ]; then
145-
kill_process "$PID_CLEAN" || true
146-
fi
188+
for p in $PIDS; do
189+
p_clean=$(sanitize_pid "$p")
190+
if [ -n "$p_clean" ]; then
191+
kill_process "$p_clean" || true
192+
fi
193+
done
147194
fi
148195
exit 0
149196
fi
150197

151-
# Evaluate
152-
check_adsprpcd_wait_state "$PID"
153-
rc=$?
198+
# Evaluate all alive PIDs
199+
fail_seen=0
200+
skip_seen=0
201+
202+
for p in $PIDS_ALIVE; do
203+
check_adsprpcd_wait_state "$p"
204+
rc=$?
154205

155-
if [ "$rc" -eq 0 ]; then
156-
log_pass "$TESTNAME : Test Passed"
157-
echo "$TESTNAME PASS" >"$res_file"
158-
elif [ "$rc" -eq 2 ]; then
206+
if [ "$rc" -eq 2 ]; then
207+
skip_seen=1
208+
break
209+
fi
210+
if [ "$rc" -ne 0 ]; then
211+
fail_seen=1
212+
fi
213+
done
214+
215+
if [ "$skip_seen" -eq 1 ]; then
159216
# SKIP already written by the function
160217
:
161218
else
162-
log_fail "$TESTNAME : Test Failed"
163-
echo "$TESTNAME FAIL" >"$res_file"
219+
if [ "$fail_seen" -eq 0 ]; then
220+
log_pass "$TESTNAME : Test Passed"
221+
echo "$TESTNAME PASS" >"$res_file"
222+
else
223+
log_fail "$TESTNAME : Test Failed"
224+
echo "$TESTNAME FAIL" >"$res_file"
225+
fi
164226
fi
165227

166228
log_info "-------------------Completed $TESTNAME Testcase----------------------------"
167229

168230
# Kill only if we started it
169231
if [ "$STARTED_BY_TEST" -eq 1 ]; then
170-
PID_CLEAN=$(sanitize_pid "$PID")
171-
if [ -n "$PID_CLEAN" ]; then
172-
kill_process "$PID_CLEAN" || true
173-
fi
232+
for p in $PIDS; do
233+
p_clean=$(sanitize_pid "$p")
234+
if [ -n "$p_clean" ]; then
235+
kill_process "$p_clean" || true
236+
fi
237+
done
174238
fi
175239

176240
exit 0

Runner/utils/functestlib.sh

Lines changed: 95 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -4343,34 +4343,68 @@ sanitize_pid() {
43434343
| awk '{print $1; exit}'
43444344
}
43454345

4346-
# Get a single PID (first match) for a given process name.
4347-
# Prefer pgrep, then get_pid, then a ps fallback.
4348-
get_one_pid_by_name() {
4346+
get_pids_by_name() {
43494347
name="$1"
4350-
[ -z "$name" ] && return 1
4351-
4352-
pid=""
4353-
4354-
# Prefer pgrep
4355-
if command -v pgrep >/dev/null 2>&1; then
4356-
pid=$(pgrep -x "$name" 2>/dev/null | awk 'NR==1{print; exit}')
4357-
pid=$(sanitize_pid "$pid")
4358-
[ -n "$pid" ] && { printf '%s\n' "$pid"; return 0; }
4348+
4349+
if [ -z "$name" ]; then
4350+
return 1
43594351
fi
4360-
4361-
# Fallback to get_pid (should already return first PID after your update)
4362-
if command -v get_pid >/dev/null 2>&1; then
4363-
pid=$(get_pid "$name" 2>/dev/null)
4364-
pid=$(sanitize_pid "$pid")
4365-
[ -n "$pid" ] && { printf '%s\n' "$pid"; return 0; }
4352+
4353+
# Print one PID per line (sanitized), for all processes whose basename matches $name
4354+
ps -ef 2>/dev/null | awk -v n="$name" '
4355+
NR==1 { next }
4356+
{
4357+
cmd=$8
4358+
sub(".*/", "", cmd)
4359+
if (cmd == n) { print $2 }
4360+
}' | while IFS= read -r p; do
4361+
p_clean=$(sanitize_pid "$p")
4362+
if [ -n "$p_clean" ]; then
4363+
printf '%s\n' "$p_clean"
4364+
fi
4365+
done
4366+
}
4367+
4368+
# Backward-compatible wrapper:
4369+
# get_one_pid_by_name <name> -> first PID
4370+
# get_one_pid_by_name <name> all -> all PIDs (newline-separated)
4371+
get_one_pid_by_name() {
4372+
name="$1"
4373+
mode="${2:-}"
4374+
4375+
pids=""
4376+
first_pid=""
4377+
4378+
for d in /proc/[0-9]*; do
4379+
[ -r "$d/comm" ] || continue
4380+
comm=$(tr -d '\r\n' <"$d/comm" 2>/dev/null)
4381+
[ "$comm" = "$name" ] || continue
4382+
4383+
pid=${d#/proc/}
4384+
case "$pid" in
4385+
''|*[!0-9]*)
4386+
continue
4387+
;;
4388+
esac
4389+
4390+
if [ -z "$first_pid" ] || [ "$pid" -lt "$first_pid" ]; then
4391+
first_pid="$pid"
4392+
fi
4393+
4394+
if [ -z "$pids" ]; then
4395+
pids="$pid"
4396+
else
4397+
pids="$pids $pid"
4398+
fi
4399+
done
4400+
4401+
[ -n "$pids" ] || return 1
4402+
4403+
if [ "$mode" = "all" ]; then
4404+
printf '%s\n' "$pids"
4405+
else
4406+
printf '%s\n' "$first_pid"
43664407
fi
4367-
4368-
# Final fallback: ps
4369-
pid=$(ps -e 2>/dev/null | awk -v n="$name" '$NF==n {print $1; exit}')
4370-
pid=$(sanitize_pid "$pid")
4371-
[ -n "$pid" ] && { printf '%s\n' "$pid"; return 0; }
4372-
4373-
return 1
43744408
}
43754409

43764410
# Wait until PID is alive (kill -0 succeeds) or timeout seconds elapse.
@@ -4441,52 +4475,49 @@ kill_process() {
44414475
}
44424476

44434477
is_process_running() {
4444-
if [ -z "$1" ]; then
4445-
log_info "Usage: is_running <process_name_or_pid>"
4446-
return 1
4447-
fi
4478+
name="$1"
44484479

4449-
input="$1"
4450-
case "$input" in
4451-
''|*[!0-9]*)
4452-
# Non-numeric input: treat as process name
4453-
found=0
4480+
pids=$(get_one_pid_by_name "$name" all 2>/dev/null) || {
4481+
log_info "Process '$name' is not running."
4482+
return 1
4483+
}
44544484

4455-
# Prefer pgrep if available (ShellCheck-friendly, efficient)
4456-
if command -v pgrep >/dev/null 2>&1; then
4457-
if pgrep -x "$input" >/dev/null 2>&1; then
4458-
found=1
4459-
fi
4460-
else
4461-
# POSIX fallback: avoid 'ps | grep' to silence SC2009
4462-
# Match as a separate word to mimic 'grep -w'
4463-
if ps -e 2>/dev/null | awk -v name="$input" '
4464-
$0 ~ ("(^|[[:space:]])" name "([[:space:]]|$)") { exit 0 }
4465-
END { exit 1 }
4466-
'; then
4467-
found=1
4468-
fi
4469-
fi
4485+
log_info "Process '$name' is running."
44704486

4471-
if [ "$found" -eq 1 ]; then
4472-
log_info "Process '$input' is running."
4487+
# Only add extra debug if multiple instances exist
4488+
case "$pids" in
4489+
*" "*)
4490+
log_info "Process '$name' instances: $pids"
4491+
;;
4492+
*)
44734493
return 0
4474-
else
4475-
log_info "Process '$input' is not running."
4476-
return 1
4494+
;;
4495+
esac
4496+
4497+
for pid in $pids; do
4498+
case "$pid" in
4499+
''|*[!0-9]*)
4500+
continue
4501+
;;
4502+
esac
4503+
4504+
cmd=""
4505+
if [ -r "/proc/$pid/cmdline" ]; then
4506+
cmd=$(tr '\000' ' ' <"/proc/$pid/cmdline" 2>/dev/null)
44774507
fi
4478-
;;
4479-
*)
4480-
# Numeric input: treat as PID
4481-
if kill -0 "$input" 2>/dev/null; then
4482-
log_info "Process with PID $input is running."
4483-
return 0
4508+
4509+
if [ -n "$cmd" ]; then
4510+
log_info "Process '$name' PID $pid cmdline: $cmd"
44844511
else
4485-
log_info "Process with PID $input is not running."
4486-
return 1
4512+
comm=""
4513+
if [ -r "/proc/$pid/comm" ]; then
4514+
comm=$(tr -d '\r\n' <"/proc/$pid/comm" 2>/dev/null)
4515+
fi
4516+
log_info "Process '$name' PID $pid comm: ${comm:-unknown}"
44874517
fi
4488-
;;
4489-
esac
4518+
done
4519+
4520+
return 0
44904521
}
44914522

44924523
get_pid() {

0 commit comments

Comments
 (0)