#!/bin/bash

pid=$1

# Validate PID
if [[ -z "$pid" || ! "$pid" =~ ^[0-9]+$ ]]; then
  echo "Usage: $0 <pid>"
  exit 1
fi

# Get total number of CPUs
#total_cpus=$(nproc)
total_cpus=$(grep -c ^processor /proc/cpuinfo)

# Extract isolcpus list
isolcpus_raw=$(grep -oP 'isolcpus=\K[^ ]+' /proc/cmdline)

#echo "🔍 Found isolcpus=[$isolcpus_raw] in /proc/cmdline"
#echo "🧠 Total CPUs: $total_cpus"

# Function to expand CPU ranges
expand_cpus() {
  echo "$1" | tr ',' '\n' | while read part; do
    if [[ "$part" == *-* ]]; then
      seq "${part%-*}" "${part#*-}"
    else
      echo "$part"
    fi
  done
}

# Expand isolated CPUs
isolated_array=()
if [[ -n "$isolcpus_raw" ]]; then
  mapfile -t isolated_array < <(expand_cpus "$isolcpus_raw")
fi

#echo "🧪 Isolated CPUs: ${isolated_array[*]}"

# Build non-isolated list
non_isolated_list=()
for ((i = 0; i < total_cpus; i++)); do
  skip=false
  for iso in "${isolated_array[@]}"; do
    if [[ "$i" -eq "$iso" ]]; then
      skip=true
      break
    fi
  done
  if ! $skip; then
    non_isolated_list+=("$i")
  fi
done

# Check and apply
if [[ ${#non_isolated_list[@]} -eq 0 ]]; then
  echo "❌ No available non-isolated CPUs to assign. Check isolcpus or system config."
  exit 1
fi

cpu_range=$(IFS=,; echo "${non_isolated_list[*]}")
#echo "✅ Assigning PID $pid to non-isolated CPUs: $cpu_range"
taskset -cp "$cpu_range" "$pid"
