#!/usr/bin/env bash
# Copyright (C) 2018, 2025  Luke T. Shumaker <lukeshu@lukeshu.com>
# SPDX-License-Identifier: AGPL-3.0-or-later

shopt -s lastpipe
set -euE -o pipefail

declare -A vcpu2cpulist
numactl=()
source "/etc/conf.d/qemu.d/$1"
args+=(
	-name "$1",debug-threads=on
	-run-with user="$USER"
	-pidfile "/usr/var/run/qemu-$1/pid"

	-vnc     unix:"/usr/var/run/qemu-$1/vnc.sock"
	-monitor unix:"/usr/var/run/qemu-$1/monitor.sock",server,nowait
	-serial  file:"/dev/stdout"

	-daemonize
)

{
	numactl "${numactl[@]}" -- qemu-system-"${system}" "${args[@]}"

	if [[ ${vcpu2cpulist+${#vcpu2cpulist[@]}} -gt 0 ]]; then
		declare -A vcpu2tid
		while read -r line; do
			if [[ $line != ?' CPU #'*:*thread_id=* ]]; then
				continue
			fi
			vcpu=${line#?' CPU #'}; vcpu=${vcpu%%:*}
			tid=${line#thread_id=}; tid=${tid%% *}
			vcpu2tid[$vcpu]=$tid
		done < <(socat STDIO UNIX-CONNECT:"/usr/var/run/qemu-$1/monitor.sock" <<<'info cpus')

		for vcpu in "${!vcpu_pins[@]}"; do
			taskset --cpu-list --pid -- "${vcpu2cpulist[@]}" "${vcpu2tid[$vcpu]}"
		done
	fi

	systemd-notify --ready
} | exec cat
