[CmdletBinding()] param() $ErrorActionPreference = 'Stop' $WorkDir = [IO.Path]::GetFullPath($PSScriptRoot) $Python = (Get-Command python.exe -ErrorAction Stop).Source $Script = Join-Path $WorkDir 'RenderSharpMesherCaptures.py' $Stdout = Join-Path $WorkDir 'render.stdout.log' $Stderr = Join-Path $WorkDir 'render.stderr.log' $Runner = Get-Process -Id $PID $Runner.PriorityClass = 'BelowNormal' $Runner.ProcessorAffinity = [IntPtr]0xFF00 $Info = [Diagnostics.ProcessStartInfo]::new() $Info.FileName = $Python $Info.Arguments = ('"{0}"' -f $Script) $Info.WorkingDirectory = $WorkDir $Info.UseShellExecute = $false $Info.CreateNoWindow = $true $Info.RedirectStandardOutput = $true $Info.RedirectStandardError = $true $Process = [Diagnostics.Process]::new() $Process.StartInfo = $Info if (-not $Process.Start()) { throw 'Could not start capture renderer.' } $Process.PriorityClass = [Diagnostics.ProcessPriorityClass]::BelowNormal $Process.ProcessorAffinity = [IntPtr]0xFF00 $StartAt = [DateTime]::UtcNow $OutputTask = $Process.StandardOutput.ReadToEndAsync() $ErrorTask = $Process.StandardError.ReadToEndAsync() $TimedOut = $false $OverMemory = $false $EightGB = 8L * 1024L * 1024L * 1024L while (-not $Process.HasExited) { $Process.Refresh() if ($Process.PrivateMemorySize64 -ge $EightGB) { $OverMemory = $true; break } if (([DateTime]::UtcNow - $StartAt).TotalSeconds -ge 900) { $TimedOut = $true; break } Start-Sleep -Milliseconds 250 } if ($TimedOut -or $OverMemory) { try { $Process.Kill() } catch {} } $Process.WaitForExit() $RenderStdout = $OutputTask.GetAwaiter().GetResult() $RenderStderr = $ErrorTask.GetAwaiter().GetResult() [IO.File]::WriteAllText($Stdout, $RenderStdout) [IO.File]::WriteAllText($Stderr, $RenderStderr) if ($TimedOut) { throw "Capture rendering exceeded 15 minutes. Logs: $Stdout / $Stderr" } if ($OverMemory) { throw "Capture renderer reached the 8 GB private-memory cap. Logs: $Stdout / $Stderr" } if ($Process.ExitCode -ne 0) { Write-Output "Capture rendering failed exit_code=$($Process.ExitCode) stdout=$Stdout stderr=$Stderr" if ($RenderStdout) { Write-Output $RenderStdout } if ($RenderStderr) { Write-Output $RenderStderr } throw 'Matched capture rendering failed.' } Write-Output "Capture render passed elapsed_seconds=$([Math]::Round(([DateTime]::UtcNow - $StartAt).TotalSeconds,2)) priority=BelowNormal affinity=0xFF00 stdout=$Stdout stderr=$Stderr"