xref: /linux/tools/perf/tests/shell/lib/perf_record.sh (revision 67f8bc848ee31831336bd478e57d2f993551902e)
1# SPDX-License-Identifier: GPL-2.0
2
3PERF_RECORD_LOGS=()
4
5perf_record_with_retry() {
6  local perfdata="$1"
7  local check_cmd="$2"
8  local testprog_base="$3"
9  shift 3
10
11  local logfile
12  logfile=$(mktemp /tmp/__perf_record_retry.XXXXXX)
13  PERF_RECORD_LOGS+=("$logfile")
14
15  # Save the e flag state and disable it
16  local save_e
17  if [[ $- == *e* ]]; then
18    save_e="set -e"
19  else
20    save_e="set +e"
21  fi
22  set +e
23
24  local duration
25  local first_run=true
26  local ret=1
27  local cmd_prefix="perf record"
28  if [ -n "${PERF_RECORD_CMD}" ]; then
29    cmd_prefix="${PERF_RECORD_CMD}"
30  fi
31
32  for duration in 0.01 0.1 0.3 1.0 2.0; do
33    rm -f "${perfdata}".old
34    ${cmd_prefix} "$@" -o "${perfdata}" ${testprog_base} ${duration} > "$logfile" 2>&1
35    local record_exit=$?
36
37    if [ "$first_run" = true ] && [ $record_exit -ne 0 ]; then
38      ret=2
39      break
40    fi
41    first_run=false
42
43    if [ -e "${perfdata}" ] && eval "${check_cmd}"; then
44      ret=0
45      break
46    fi
47  done
48
49  eval "$save_e"
50  return $ret
51}
52
53perf_record_cleanup() {
54  for logfile in "${PERF_RECORD_LOGS[@]}"; do
55    rm -f "$logfile"
56  done
57  PERF_RECORD_LOGS=()
58}
59