Graven (PPSA09614) imports sce::Json::Array::pop_front()
(pPs3qZTZQvQ) from one call site of its executable, and no built
library exported it, so tools/import_audit.py lists it as absent and
the loader stops before the title starts.
pop_front removes the first element and destroys it, like clear does
for every element. On an empty array it throws std::out_of_range, as
front and back do here; the console's result there is unverified and
listed in the debt file.
guest_json pops both elements of a two-element copy, checks the
remaining element and the empty array, and expects the throw on a
third pop.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
sceNpAbortRequest and sceNpDeleteRequest return SCE_NP_ERROR_REQUEST_NOT_FOUND
for an id that was never created or was deleted; sceNpPollAsync does too and
additionally rejects a null result pointer with SCE_NP_ERROR_INVALID_ARGUMENT
before reading the id, without writing the caller's result. A live request
keeps its signed-out completion. This pins the validation half of shadPS4's
np_manager model that issue #9277 reports; the kind, completion state and
WaitAsync publication half stays open, documented in the debt entry, and the
sceNpWaitAsync export itself stays with PR #9282.
Tests: guest_np_manager tests the four absent/deleted probes (0, -1, 0x7fffffff,
a deleted id) for all three calls, output preservation, null-result precedence
and the live-id paths; guest_np_reachability unchanged. Both pass on Linux; the
new asserts failed on unpatched exports first.
guest_flexible_memory_declared loads a host-built .guest.prx fixture
whose 512 MiB array must count against the flexible memory budget. On
macOS, dl_iterate_phdr reports only images that carry the relinker's
__APS5DATA,__meta program headers, which every relinked guest module
has but the host-built fixture does not. GuestImageSegmentBytes left
the fixture out and the test failed at its budget check.
On macOS the fixture now fills its own __APS5DATA,__meta at load with
one PT_LOAD header for the array, as ProcessParametersFixture does for
the test program. Linux and Windows are unchanged.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
sceNetConnect dissolves a datagram association with the same host call sequence as connect (disconnect_datagram in Export.cpp). The sceNetConnect-to-AF_UNSPEC debt entry only described Linux. On Windows a socket bound to an explicit address keeps it in the same way, and a sendto on the host socket to a non-loopback address fails with Winsock error 10051, where FreeBSD's udp_disconnect() resets the local address.
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
The driver's operator new and delete keep up to 64 freed blocks per
16-byte size class per thread (16 above 256 bytes). When blocks are made
on one thread and deleted on another, the deleting thread's list of that
class fills and its further deletes go to the heap, while the making
thread's list stays empty and its allocations go to the heap too. On the
title screen of Spirit of the Island (PPSA13934), with the queue worker
and the draw committer both busy, 14.8M of 58M allocations up to 1 KiB
in 10 s missed the cache, and the deletes that overflowed to the heap
matched the misses class for class. Lists eight times deeper and classes
up to 4 KiB still missed 13.7M times, so the misses are blocks crossing
threads, not bursts deeper than a list.
A delete that finds its thread's list of the class full now hands that
whole list to a per-class depot and starts a new one; an allocation that
finds its thread's list empty takes a list from the depot before going
to the heap. Each depot keeps at most eight lists behind an SRW lock,
about 5 MiB over all classes; a full list past that still goes to the
heap block by block, as before. With this, 0.44M of 66M allocations up
to 1 KiB in 10 s miss on the same screen. A kept list is linked through
its first block's second word, so every class (16 bytes and up) can hold
it.
agc_driver_host_allocator gains a case where one thread makes blocks
that another deletes at the same time, checking their bytes up to the
delete and that private bytes stay flat over 12 rounds of 200k blocks.
Co-Authored-By: Claude Opus 5.5 <[email protected]>