Skip to content

fix(agc): keep capture trace output nonfatal - #10760

Open
lgqdaxia wants to merge 5 commits into
boykopovar:mainfrom
lgqdaxia:codex/fix-capture-trace-backpressure
Open

lgqdaxia wants to merge 5 commits into
boykopovar:mainfrom
lgqdaxia:codex/fix-capture-trace-backpressure

Conversation

@lgqdaxia

@lgqdaxia lgqdaxia commented Oct 24, 2026 •

Copy link
Copy Markdown

What

Capture tracing can currently throw when its 16 MiB pending queue fills, or stop the process when file output fails. This follows the capture policy requested in #10753 and replaces this PR's earlier waiting proposal.

  • A full queue drops new records and counts them. The next drained batch writes capture-trace-dropped records=N; normal trace shutdown writes capture-trace-summary dropped=N. Accepted records and loss markers keep their sequence order. After a drop, records are rejected until the next drain so a shorter record cannot appear before the loss marker.
  • A failed write or flush disables tracing, clears its pending queue and reports one error to stderr. Later calls return without queueing more output. Stream failures are checked directly, without relying on C++ exception unwinding. Oversized formatted records are also counted as lost.
  • The pending bound remains 16 MiB; the writer can hold another batch plus small marker overhead. A native file I/O call that never returns can still delay normal shutdown while it joins the writer. This remaining limitation is recorded in the debt entry; no I/O cancellation is claimed.

AI-assisted: Codex

#11157 has merged. This rebase preserves its Linux frame-capture debt text, with Capture trace output immediately before Frame capture; the remaining upstream debt text is unchanged. PR #7622 also touches the writer-startup lines in the same header. Its independent StartHostThread change must be retained alongside this PR's active initialization and non-throwing stream policy if the branches are later combined. That combination has not been runtime-tested. No GPU semantics are changed.

Tested

  • Rebased onto main 801d5b9bc11049e6274daca09d70690bd5b8d0a9; new head c4ad483347359e4df0951220d4ca6394a052bc47. Manual conflicts were confined to docs/dev/debt/libSceAgcDriver.md. Removing this PR's single trace-output entry reproduces that base's debt file byte-for-byte. The capture header, both C++ fixtures and the CMake failure wrapper are byte-identical to the previously published head 48f785262b5d8e388ed0be86fc954a1c2c1c9dde.
  • Windows x64, WinLibs GCC 15.2.0/UCRT r7, CMake 4.3.1, Ninja Release: regenerated the real project configuration with BUILD_TESTING=ON. tools/check_test_registration.py passes, reporting 1466 test executable(s), 0 built and not run as recorded, none new. Built the three capture-trace targets and their dependencies, including the project's libc. All 16 capture-trace CTests plus public_headers pass (17/17), including host and project-runtime write/flush failure cases. Total CTest time was 62.80 s; the existing public_headers audit accounted for 60.78 s locally. This was a targeted build and test run, not a full default product build or full CTest suite.
  • Separate Windows host-component comparison: isolated snapshots of that exact main and this rebased head build their actual capture fixture/header, using the same eight common repository test registrations. 8/8 pass on main and 8/8 on the change. These components link the host standard library and Threads, not the project's replacement runtime. Their 0.51/0.53 s totals are execution records, not a performance claim.
  • The CPU checks above set ANYPS5_REQUIRE_VULKAN=1, ANYPS5_NO_SHADER_CACHE=1 and VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation; their logs contain neither the missing-layer warning nor VUID- lines. The fixtures do not initialize Vulkan, so no GPU or validation-layer execution is claimed. Conventions and git diff --check pass.
  • Historical hosted evidence: Build 40458520694 tested old head 48f785262b5d8e388ed0be86fc954a1c2c1c9dde merged into main 32906a0659a5caaea09340b7424091184f4c4293. Both Linux and Windows completed compilation and libs, and passed their 16 capture-trace tests. Both full CTest jobs failed the same pre-existing public_headers audit, leaving 64 dependent checks per platform not run; #11718 subsequently fixed the duplicate declaration. Those results do not establish hosted CI success for this rebased head. A full CI pass on the new head remains unconfirmed.
  • Not tested on this rebase: the full default product build and full CTest suite, Linux product/runtime behavior, macOS capture behavior, a game with capture tracing enabled, real SMB throughput, or cancellation of permanently blocked native file I/O. Earlier broader local Windows builds, Linux host checks and negative controls remain historical evidence on their recorded bases. No game compatibility or performance claim.

Checklist

  • Based on current main; no other open PR implements the same functions
  • One topic per PR; follow-ups go in a new PR
  • No comments in code except technical debt
  • Unimplemented paths throw (NotImplemented_nid_no_patch); silent stubs are listed under Silent stubs in their library's technical debt file
  • No notes, investigation .md files or images added to the repository (attach them to this PR)
  • New third-party code is a submodule built from source
  • Generic behaviour, not specific to one title
  • Depends on: none
  • Fixes: Fixes AGC: capture-trace queue overflow aborts PPSA99902 at title screen (SMB output) #10753
  • Unblocks: none
  • GPUs tested: n/a; CPU-only capture logging checks, no Vulkan execution
  • AI-assisted: yes; Codex

@MarcZX10 MarcZX10 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The happy-path backpressure test is useful, and I verified that the worker’s 100 ms timed wait drains a full queue even when it is below the normal 64 KiB notify threshold. I found an unhandled writer-error path in the new wait protocol:

  1. run() swaps pending into batch and notifies spaceAvailable.
  2. A waiting producer wakes and can fill pending back to the limit.
  3. If output.write() or output.flush() then throws, the catch calls std::terminate() and the worker exits without notifying spaceAvailable again.
  4. The producer’s predicate only checks queue size, so it can remain blocked forever; the destructor can also wait indefinitely if this occurs during shutdown.

The PR says file-write errors retain their existing behavior, but the new condition-variable wait adds a stranded-waiter case on that existing fatal path. Please either make writer failure a synchronized terminal predicate that wakes all waiters (and ensure shutdown handles it consistently), or demonstrate with a deterministic failing stream test that this state cannot occur. Please add a focused regression for writer failure; the current test only exercises a recovering sink. I have not modified your branch.

@github-actions

github-actions Bot commented Oct 24, 2026 •

Copy link
Copy Markdown

Other open pull requests touch the same code. Merging one will break the other, or both implement the same thing. If this one builds on them, list them in Depends on.

Pull request Conflicting files (lines on main) Same exports Same new files
PR 7622 core/libs/prx/libSceAgcDriver/Execution/include/CaptureTrace.hpp L60-61

Some comparisons could not be completed because a pull request conflicts with the base branch. Review these shared files manually before concluding that there is no overlap.

Pull request Shared files not compared
PR 1368 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 1395 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 1896 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 2434 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/debt/libSceAgcDriver.md
PR 4448 docs/dev/debt/libSceAgcDriver.md
PR 4449 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/debt/libSceAgcDriver.md
PR 5021 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 5371 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 5372 docs/dev/debt/libSceAgcDriver.md
PR 5925 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/debt/libSceAgcDriver.md
PR 6187 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 6188 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 6192 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 6194 docs/dev/debt/libSceAgcDriver.md
PR 6209 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 6223 docs/dev/debt/libSceAgcDriver.md
PR 6273 docs/dev/debt/libSceAgcDriver.md
PR 6280 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/debt/libSceAgcDriver.md
PR 6300 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/debt/libSceAgcDriver.md
PR 6412 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/debt/libSceAgcDriver.md
PR 6481 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/debt/libSceAgcDriver.md
PR 6548 docs/dev/debt/libSceAgcDriver.md
PR 6549 docs/dev/debt/libSceAgcDriver.md
PR 6743 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/debt/libSceAgcDriver.md
PR 6804 docs/dev/debt/libSceAgcDriver.md
PR 6808 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/debt/libSceAgcDriver.md
PR 6926 docs/dev/debt/libSceAgcDriver.md
PR 6959 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/debt/libSceAgcDriver.md
PR 6977 docs/dev/debt/libSceAgcDriver.md
PR 7048 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 7256 docs/dev/debt/libSceAgcDriver.md
PR 7275 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 7395 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 7449 docs/dev/debt/libSceAgcDriver.md
PR 7457 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 7514 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 7604 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/debt/libSceAgcDriver.md
PR 7642 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/debt/libSceAgcDriver.md
PR 8223 docs/dev/debt/libSceAgcDriver.md
PR 8319 docs/dev/debt/libSceAgcDriver.md
PR 8395 docs/dev/debt/libSceAgcDriver.md
PR 8484 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 8542 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/debt/libSceAgcDriver.md
PR 8592 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/debt/libSceAgcDriver.md
PR 8939 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 9020 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/debt/libSceAgcDriver.md
PR 9248 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 9335 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/debt/libSceAgcDriver.md
PR 9356 docs/dev/debt/libSceAgcDriver.md
PR 9387 docs/dev/debt/libSceAgcDriver.md
PR 9431 docs/dev/debt/libSceAgcDriver.md
PR 9432 docs/dev/debt/libSceAgcDriver.md
PR 9457 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 9508 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/debt/libSceAgcDriver.md
PR 9533 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/debt/libSceAgcDriver.md
PR 9592 docs/dev/debt/libSceAgcDriver.md
PR 9633 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 9672 docs/dev/debt/libSceAgcDriver.md
PR 9673 docs/dev/debt/libSceAgcDriver.md
PR 9674 docs/dev/debt/libSceAgcDriver.md
PR 9675 docs/dev/debt/libSceAgcDriver.md
PR 9676 docs/dev/debt/libSceAgcDriver.md
PR 9717 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/debt/libSceAgcDriver.md
PR 9742 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/debt/libSceAgcDriver.md
PR 9748 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/debt/libSceAgcDriver.md
PR 9749 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 9790 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 9842 docs/dev/debt/libSceAgcDriver.md
PR 9852 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 9891 docs/dev/debt/libSceAgcDriver.md
PR 9892 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/debt/libSceAgcDriver.md
PR 9893 docs/dev/debt/libSceAgcDriver.md
PR 9895 docs/dev/debt/libSceAgcDriver.md
PR 9897 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 9950 docs/dev/debt/libSceAgcDriver.md
PR 9969 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 10000 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 10043 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 10049 docs/dev/debt/libSceAgcDriver.md
PR 10064 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/debt/libSceAgcDriver.md
PR 10193 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/debt/libSceAgcDriver.md
PR 10233 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/debt/libSceAgcDriver.md
PR 10333 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/debt/libSceAgcDriver.md
PR 10348 docs/dev/debt/libSceAgcDriver.md
PR 10359 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/debt/libSceAgcDriver.md
PR 10435 docs/dev/debt/libSceAgcDriver.md
PR 10442 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 10489 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 10757 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 10846 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 10867 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 11081 docs/dev/debt/libSceAgcDriver.md
PR 11451 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 11557 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/debt/libSceAgcDriver.md
PR 11690 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 11692 core/libs/prx/libSceAgcDriver/CMakeLists.txt

@lgqdaxia

Copy link
Copy Markdown
Author

@MarcZX10 Thanks for asking for this check. I added write-failure and flush-failure tests in 58afe45.

Each test holds the writer, fills the queue, starts four producers, and checks that none can finish. It then makes the stream return a short write or a failed flush. To pass, the child must reach the real writer catch, call the saved original terminate handler, and exit with the same result as an abort control. A random crash or timeout does not count.

All 11 capture-trace tests pass locally on Windows, and both new cases passed 10 consecutive runs. I also tried a temporary copy where the catch returns instead of calling terminate: both tests failed through the watchdog, with the producers still waiting.

One clarification: std::terminate() ends the whole process; it does not just exit the writer thread. I kept the existing fatal file-error policy, since this test did not reproduce a surviving process stuck on that path.

There is a coverage limit: these are host-runtime component tests using the production header. With the project's current Windows libc linked, my separate probe exits earlier with has no unwind data, before reaching this catch. I have documented that in the PR and am not counting it as successful catch-path coverage under the project's runtime. I have not tested a game or a real SMB share.

This investigation and the new tests were AI-assisted with Codex.

@MarcZX10 MarcZX10 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Rechecked exact head 58afe4560099d805edf020ae603e84a5fec063d6. The added writer-failure tests address the stranded-producer concern: they fill the bounded queue, verify four producers remain blocked, then trigger both a short write and a failed flush through the production CaptureTrace::run() catch and require the saved terminate handler to abort. The fixture distinguishes setup failure, watchdog exit, handler return, and the abort control result. The PR also clearly limits this evidence: the failure target uses the host C++ runtime; the separate probe with the project's Windows libc did not reach the catch, and that path is not claimed as covered.

I independently compiled CaptureTrace.cpp and CaptureTraceFailure.cpp from this exact head on Linux with g++ -std=c++20 -Wall -Wextra -Werror -pthread. The queue-backpressure case passed, and the CMake failure harness passed both write and flush modes. tools/check_conventions.py --base upstream/main --head upstream/pr/10760 and git diff --check pass. Hosted conventions and labels pass; the product build/test jobs are skipped by path filters, so I am not claiming hosted product coverage. The author reports the full Windows library/relinker builds and focused Windows suite in the PR description.

@lgqdaxia
lgqdaxia marked this pull request as ready for review October 24, 2026 23:49
@github-actions github-actions Bot added the fix error Closes an issue (Fixes #N) label Oct 24, 2026
@oneandonlydean oneandonlydean self-assigned this Oct 25, 2026
@Amoenus

Amoenus commented Oct 25, 2026

Copy link
Copy Markdown
Contributor

Independent synthetic validation of 58afe4560099, from the reporter of #10753:

  • Windows 11 Enterprise 26200, WinLibs GCC 15.2.0/UCRT r7: 11/11 CPU fixtures pass, maximum CTest 1.48 s. This includes the paused-writer/four-producer recovery/order case and both write/flush failure wrappers with their abort controls.
  • A separate deliberately invalid header copy changes the worker's fatal catch to return. Both unchanged failure wrappers reject it after their watchdog; that mutation was used only as a negative test control.

I compiled your pinned public header/fixtures as standalone host-runtime executables, with no AnyPS5 replacement libc or driver linkage. Scratch files were on our NAS, but the paused/failing sinks are synthetic buffers: this is not an SMB-throughput test, full configured PR build, game/GPU validation, or approval of the logging policy. Your documented possibility of stalled callers/shutdown remains a maintainer decision in #10753. No composition branch was changed for this check.

AI-assisted: yes (Codex).

@janzezno

Copy link
Copy Markdown
Contributor

@lgqdaxia #11157 (Linux frame capture) and this PR touch the same spot in docs/dev/debt/libSceAgcDriver.md: your "Capture trace output" entry goes in right above the "Frame capture" entry, and #11157 rewrites that entry. Nothing else overlaps, and neither change depends on the other.

I'm happy with either order: whichever merges second rebases and keeps both entries (yours first, then the rewritten "Frame capture" one). No Depends on either way. If that works for you, I'll record it in #11157's Overlap line.

Unrelated small thing I noticed while reading it: the entry is followed by an empty line, which splits the Functional list in two when rendered.

@lgqdaxia

Copy link
Copy Markdown
Author

Agreed, @janzezno. I checked #11157's changed files and patches: the production changes are independent, and the CMake test additions are in separate sections.

Let's keep both PRs independent, with no Depends on, and let whichever is ready first merge. The second branch rebases and retains both debt entries, with Capture trace output immediately above the updated Frame capture entry. I'll handle that rebase for #10760 if it merges second. You can record this agreement in #11157's overlap note.

I also removed the extra blank line in 29c4b17a3c. That commit only deletes the blank line; production and test sources are unchanged. Conventions and git diff --check pass.

AI-assisted: Codex

@oneandonlydean

Copy link
Copy Markdown
Collaborator

@lgqdaxia Thanks for picking this up. I've answered the policy question on #10753: a trace must never stop or stall the program, so when the queue is full it should drop new records and count them rather than wait. Could you change the PR to:

  • drop records once the queue is full, keep a dropped count, and write it into the trace (a marker when output resumes and a total at shutdown);
  • end tracing with a logged error on a write or flush failure instead of stopping the process;
  • adapt the tests: a paused writer with a full queue must not block the callers, and the trace must record how many records were lost.

The queue limit can stay as it is.

@lgqdaxia
lgqdaxia force-pushed the codex/fix-capture-trace-backpressure branch from 29c4b17 to efb3dc3 Compare October 25, 2026 23:29
lgqdaxia added a commit to lgqdaxia/AnyPS5 that referenced this pull request Oct 25, 2026
Follow the capture policy requested in boykopovar#10753 and boykopovar#10760. Keep queue callers running, record loss markers and totals, and disable failed output without relying on stream exceptions.

AI-assisted: Codex
@lgqdaxia lgqdaxia changed the title fix(agc): wait when the capture trace queue is full fix(agc): keep capture trace output nonfatal Oct 25, 2026
@lgqdaxia

Copy link
Copy Markdown
Author

@oneandonlydean Updated in efb3dc3e36 and rebased onto main 1997e647f9.

The queue now drops new records and counts them. When the writer resumes, the trace gets a capture-trace-dropped records=N marker; normal shutdown writes capture-trace-summary dropped=N. The pending limit stays at 16 MiB. The tests hold the writer paused and require all four callers to return before it is released, then check the exact lost count and record order. A two-period case checks 257 + 69 = 326 at shutdown.

Write and flush errors now stop tracing and log one error instead of terminating the process. I changed this to direct stream-state checks, so it does not need the exception path that had limited the earlier Windows tests. Both failures now pass with the host runtime and the project's own Windows libc, including later calls doing no more output and normal destruction.

Full Windows library/relinker builds and 18 selected checks pass. Linux actual-header host components pass 14/14, plus a real /dev/full failure check. The PR body now describes the current behavior and test limits. These are CPU checks, not game, GPU or real SMB validation. A permanently stuck native write can still delay shutdown's join; that limitation remains in the debt entry.

AI-assisted: Codex

@github-actions github-actions Bot added the needs rebase Conflicts with main, rebase needed label Oct 26, 2026
@oneandonlydean

Copy link
Copy Markdown
Collaborator

@lgqdaxia Thanks for the drop-and-count rework. CI on efb3dc3e36 (run 40277848421) fails on both Linux and Windows before any test runs, at the test registration check:

error: agc_capture_trace_failure_tests is built but no ctest test runs it
error: agc_capture_trace_runtime_failure_tests is built but no ctest test runs it

The four agc_capture_trace_{write,flush}_failure[_runtime] tests do run them, but only through -DFIXTURE=$<TARGET_FILE:...> (core/libs/prx/libSceAgcDriver/CMakeLists.txt:633 and :640). tools/check_test_registration.py skips any argument that starts with -, so it never sees those two executables. Could you pass the fixture as a plain argument after the script instead, e.g. -P ".../tests/CaptureTraceFailure.cmake" "$<TARGET_FILE:agc_capture_trace_failure_tests>", and read it from CMAKE_ARGV<n> in CaptureTraceFailure.cmake? Any form where the executable path appears as a plain add_test argument will do.

The branch also conflicts with main again, so please rebase while you're at it. python3 tools/check_test_registration.py build on a configured build should then report nothing new, and we'll rerun full CI on the new head.

@lgqdaxia
lgqdaxia force-pushed the codex/fix-capture-trace-backpressure branch from efb3dc3 to 48f7852 Compare October 26, 2026 08:41
lgqdaxia added a commit to lgqdaxia/AnyPS5 that referenced this pull request Oct 26, 2026
Follow the capture policy requested in boykopovar#10753 and boykopovar#10760. Keep queue callers running, record loss markers and totals, and disable failed output without relying on stream exceptions.

AI-assisted: Codex
@lgqdaxia

Copy link
Copy Markdown
Author

@oneandonlydean Thanks, you're right. The fixtures ran locally, but I had missed running the registration audit.

Fixed in 48f785262b. Both add_test commands now pass the executable, mode and output directory as plain arguments after -P CaptureTraceFailure.cmake; the script reads CMAKE_ARGV3 through CMAKE_ARGV5.

I reproduced the two registration errors before the change. After reconfiguring, the full Windows build's registration audit reports 1383 test executables, 0 unregistered. Rebuilt the three capture targets and their dependencies; all 16 capture CTests pass, including all four host/project-runtime write/flush cases. On WSL Linux, the actual source and wrapper also pass both host failure tests with a spaced output path; this is component coverage, not a full Linux product build.

Rebased onto main b27cc8416f and kept its updated debt text. The capture header and C++ fixtures are unchanged from efb3dc3e36. Conventions and diff checks pass. The PR body separates these new checks from the earlier broader build results; the new head is ready for full CI.

AI-assisted: Codex

@github-actions github-actions Bot removed the needs rebase Conflicts with main, rebase needed label Oct 26, 2026
@lgqdaxia

Copy link
Copy Markdown
Author

@oneandonlydean Following up on Build 40458520694: Linux and Windows both passed the registration audit, completed the product compilation and libs build, and passed all 16 capture-trace tests on each platform.

Both jobs failed the same public-header declaration audit, leaving 64 dependent checks per platform not run. The same failure reproduces on the unmodified tested main 32906a0659a5, without this PR.

#11718 has since fixed that duplicate declaration. The source-only audit passes on main 81267b2204e4; that does not establish a new product build or full CI pass. I've updated the PR's test summary with these results and limits. The capture branch is unchanged at 48f785262b5d.

If another run is not already queued, could you start a new full CI run on this head against the fixed main when capacity allows?

AI-assisted: Codex

@github-actions github-actions Bot added the needs rebase Conflicts with main, rebase needed label Oct 27, 2026
lgqdaxia and others added 5 commits October 27, 2026 10:20
Wait for the writer to take a batch instead of throwing when the pending queue is full. Add a controlled-sink test with four producers and check that records stay complete and ordered.

AI-assisted: yes
Remove the extra blank line between capture trace output and frame capture. The independent changes in boykopovar#11157 may merge in either order; the second branch keeps both entries when rebasing.

AI-assisted: Codex
Follow the capture policy requested in boykopovar#10753 and boykopovar#10760. Keep queue callers running, record loss markers and totals, and disable failed output without relying on stream exceptions.

AI-assisted: Codex
@lgqdaxia
lgqdaxia force-pushed the codex/fix-capture-trace-backpressure branch from 48f7852 to c4ad483 Compare October 27, 2026 09:40
@lgqdaxia

Copy link
Copy Markdown
Author

@oneandonlydean Rebased onto main 801d5b9bc110 after #11157 merged. The new head is c4ad483347359e4df0951220d4ca6394a052bc47.

The manual conflicts were only in the debt file. Both the updated Linux frame-capture entry and our trace-output entry are retained. The capture header, C++ fixtures and failure wrapper are unchanged from 48f785262b5d.

On the rebased Windows project configuration, the registration audit passes; all three capture targets build, and 16 capture tests plus the public-header audit pass (17/17). The public-header audit took 60.78 s locally. A separate CPU-only host comparison passes the same eight common tests on main and the change. These checks do not establish a full product build, GPU/game validation or a new hosted CI pass.

I've updated the PR's validation summary and kept the previous hosted results clearly marked as historical. If a run on this new head is not already queued, could you start a new full CI run when capacity allows?

AI-assisted: Codex

@github-actions github-actions Bot removed the needs rebase Conflicts with main, rebase needed label Oct 27, 2026

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

agc libSceAgc* build docs fix error Closes an issue (Fixes #N)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

AGC: capture-trace queue overflow aborts PPSA99902 at title screen (SMB output)

5 participants