# DyzineFrame process pin helper (source; do not exec).
# Prefers shared EtherGold cpu_layout when present (same lane numbers).
# DF defaults to OHD_CPU_DF_SET (0-2) — all cores except EG; not a single core.
# Operator off (all cores, like pre-pin): run/cpu_affinity.disabled
#   HDMI Supervisor CPU-pin Disable, or: bash set_cpu_affinity.sh disable

if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
  echo "FATAL: source cpu_affinity.sh" >&2
  exit 1
fi

_DF_CPU_LAYOUTS=(
  "${HOME}/EtherGold/prod/cpu_layout.sh"
  "${HOME}/EtherGold/dev/cpu_layout.sh"
  "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/../EtherGold/dev/cpu_layout.sh"
)

_OHD_LAYOUT_SOURCED=0
for _layout in "${_DF_CPU_LAYOUTS[@]}"; do
  if [[ -f "${_layout}" ]]; then
    # shellcheck source=/dev/null
    source "${_layout}"
    _OHD_LAYOUT_SOURCED=1
    break
  fi
done
unset _layout _DF_CPU_LAYOUTS

# Honor persistent disable even when an older cpu_layout.sh is sourced.
_ohd_cpu_flag=""
for _ohd_cpu_flag in \
  "${HOME}/DyzineFrame/run/cpu_affinity.disabled" \
  "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/run/cpu_affinity.disabled" \
  /etc/ethergold/cpu_affinity.disabled
do
  if [[ -f "${_ohd_cpu_flag}" && "${OHD_CPU_FORCE:-0}" != "1" ]]; then
    OHD_CPU_ENABLE=0
    break
  fi
done
unset _ohd_cpu_flag

if [[ "${_OHD_LAYOUT_SOURCED}" != "1" ]]; then
  OHD_CPU_ENABLE="${OHD_CPU_ENABLE:-1}"
  OHD_CPU_DF="${OHD_CPU_DF:-2}"
  OHD_CPU_DF_SET="${OHD_CPU_DF_SET:-0-2}"
  ohd_cpu_count() { nproc 2>/dev/null || echo 1; }
  ohd_cpu_lanes_ok() {
    [[ "${OHD_CPU_ENABLE}" == "1" ]] || return 1
    [[ "$(ohd_cpu_count)" -ge 4 ]] || return 1
  }
  ohd_have_taskset() { command -v taskset >/dev/null 2>&1; }
  ohd_df_exec() {
    if ohd_cpu_lanes_ok && ohd_have_taskset; then
      exec taskset -c "${OHD_CPU_DF_SET}" "$@"
    else
      exec "$@"
    fi
  }
  ohd_df_run() {
    if ohd_cpu_lanes_ok && ohd_have_taskset; then
      taskset -c "${OHD_CPU_DF_SET}" "$@"
    else
      "$@"
    fi
  }
fi
unset _OHD_LAYOUT_SOURCED
