#!/usr/bin/env zsh

zmodload zsh/system

launch_instance() {
    (
	exec 2>&1; set -vx
	{ (inner_spawn) || print "exit code: $?" >&2 } | {
	    while read -r line; do
		continue
	    done
	}
    ) &
}

function spawn_subprocess() {
    # Launch multiple parallel instances for higher crash rate
    local parallel_count=2
    repeat $parallel_count; do
	launch_instance
    done

    wait
}

function process_output() {
    local chunk="$1"
    trace_buffer+="$chunk"
    local filtered_chunk=""

    while [[ $trace_buffer == *$'\n'* ]]; do
	local line="${trace_buffer%%$'\n'*}"
	trace_buffer="${trace_buffer#*$'\n'}"

	if [[ $line =~ '^[[:space:]]*\+[^:]+:[0-9]+>' ]]; then
	    # skip trace line
	else
	    filtered_chunk+="$line"$'\n'
	fi
    done

    if [[ -n $trace_buffer ]]; then
	filtered_chunk+="$trace_buffer"
    fi

    if [[ -n $filtered_chunk ]]; then
	print -rn "$filtered_chunk"
    fi
}

function inner_spawn() {
    local fd_out

    # Only create FIFO if it doesn't exist
    [[ -p "/tmp/testcase.fifo" ]] || mkfifo "/tmp/testcase.fifo" || return 125

    # Spawn test subprocess asynchronously
    {
	# Subprocess setup

	# Execute test
	() {
	    unsetopt ERR_EXIT
	    unsetopt err_return

	    function main_task() {
		exec 2>&1
		#set -vx
		pwd >/dev/null
	    }

	    main_task
	    return 0
	}

    } >"/tmp/testcase.fifo" &

    exec {fd_out}<"/tmp/testcase.fifo"

    # Dynamic scoping variables for trace line parsing
    local trace_buffer=""

    local io_chunk
    while sysread -i $fd_out -s 128 io_chunk; do
	process_output "$io_chunk"
    done
}

count=${1:-100}

{ repeat $count; do spawn_subprocess; done } | grep -v '^\+'
