Add PTM PlayHistory.dat support backed by system savedata 00010022, including read/write helpers, play-history IPC handlers, NotifyPlayEvent, ClearPlayHistory, CalcPlayHistoryStart, and zero-filled empty-state repair.
Record play events from APT application, HOME Menu, library applet, and system applet lifecycle transitions so Activity Log can aggregate valid sessions from regenerated saves.
Add fs:USER handlers for ListSeeds, GetNumTitleTags, and ListTitleTags used by Activity Log library scans, and wire remaining PTM common handlers needed by the app.
Validation: git diff --check; user confirmed regenerated PTM and Activity Log saves display correctly.
Async IPC continuations can finish while System::Shutdown is tearing down service, kernel, and timing state. The dump showed an HTTP ReceiveData RunAsync task calling Thread::WakeAfterDelay after shutdown had begun, which reached Core::Timing::ScheduleEvent with invalid timing state and crashed.
Mark KernelSystem as shutting down at the start of System::Shutdown and in the kernel destructor. Route RunAsync and RunOnThreadWorker completions through HLERequestContext::WakeAfterAsync, which skips scheduling guest-thread wakes once shutdown starts and balances the pending async counter instead.
Validation: git diff --check
The previous NullWaitObject fix only covered WaitSynchronizationN (0x25).
WaitSynchronization1 (0x24) had the same issue: handle=0 returned
ResultInvalidHandle immediately, crashing any process whose wait handle
had not been populated yet.
Apply the same fix: handle=0 is substituted with a NullWaitObject so the
thread sleeps until the timeout expires and receives ResultTimeout, matching
real hardware behaviour.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
svc.cpp / kernel:
- Add NullWaitObject: handle=0 in svcWaitSynchronizationN is treated as a
permanently-unavailable slot (never fires) instead of returning
ResultInvalidHandle. Official Nintendo APT library builds pass aptSleepSync=0
when sleeping for HOME Menu; real hardware silently ignores null slots and lets
the other handles (APT:Parameter) drive the wakeup.
- Process now inherits WaitObject so svcWaitSynchronizationN on process handles
works correctly. LLE HOME Menu waits on a process handle during startup;
previously Azahar returned ResultInvalidHandle because Process only extended
Object, not WaitObject. Process becomes available (ShouldWait=false) when it
exits; TerminateProcess calls WakeupAllWaitingThreads.
applet_manager.cpp / apt.cpp:
- RequestForSysApplet auto-Response now attaches a pre-signaled event so the
application can svcWaitSynchronizationN on the received handle without hanging.
- Wakeup parameters with no object now get a pre-signaled event (same fix).
- RegisterApplet initial Wakeup now sends a pre-signaled event.
- LeaveHomeMenu: supply a pre-signaled event when HOME Menu passes handle=0, so
the application does not crash when it calls svcSignalEvent on the result.
- Removed the old logic that force-nulled objects on system→application sends
(this was masking the real issue and breaking Wakeup handle delivery).
cfg.cpp:
- GetRegion defaults from_secure_info=true so CFGU_SecureInfoGetRegion reads
SecureInfo_A (contains the hardware region) instead of falling back to
auto-detect which returned JPN(0) for 3DSX homebrew with no preferred regions.
fs_user.cpp/h:
- Implement GetSdmcCtrRootPath (0x0848): returns /Nintendo 3DS/<ID0>/<ID1> as a
UTF-16LE wide string.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adds Tools > Create Shortcuts for All Games > Add to Desktop /
Add to Applications Menu. Asks for fullscreen preference once, then
iterates every unique game in the list with a progress dialog and
shows a summary on completion. Hidden on macOS where single-game
shortcut creation is also unsupported.
GameList gains GetAllGames() to enumerate unique (program_id, path)
pairs from the model, deduplicating entries that appear in both a
directory and the Favorites section.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- ReceiveData now streams body data in chunks via content_receiver + stream_cv
instead of blocking until the full response body is downloaded; fixes downloads
of large files that would time out before the body completed
- GetDownloadSizeState returns Content-Length from response headers immediately
(via response_headers_future) rather than waiting for the progress callback,
matching real hardware behavior
- GetResponseStatusCode and GetResponseHeader resolve from response_headers_future
so they return as soon as headers arrive, not after full body download
- CancelConnection implemented: cancel_mutex + cancel_stop_fn set/cleared around
client->send(); calling stop() aborts any in-flight request
- Cert chain stubs: CreateRootCertChain, DestroyRootCertChain, RootCertChainAddCert,
RootCertChainAddDefaultCert, RootCertChainRemoveCert, SelectRootCertChain
- Shutdown fix: HTTP_C destructor sets async_shutdown and spin-waits for
async_pending==0; async lambdas bail early on shutdown to prevent
use-after-free of freed KernelSystem
- AM: remove redundant encrypted CIA check that blocked legitimate installs
- build-azahar.ps1: deploy now copies per-file with error counting instead of
Move-Item so locked files (emulator open) produce warnings rather than silent failure
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* ci: Add sbom and attestation
* tools: Add verify-release.sh
* verify-release.sh: Set executable permission
* verify-release.sh: Put downloads into a gitignored directory
* tools: Make verify-release also download sbom
---------
Co-authored-by: OpenSauce04 <opensauce04@gmail.com>
* ci: Add sbom and attestation
* tools: Add verify-release.sh
* verify-release.sh: Set executable permission
* verify-release.sh: Put downloads into a gitignored directory
* tools: Make verify-release also download sbom
---------
Co-authored-by: OpenSauce04 <opensauce04@gmail.com>
citra-build / linux-x86_64 (appimage) (push) Waiting to run
citra-build / linux-x86_64 (appimage-wayland) (push) Waiting to run
citra-build / linux-x86_64 (gcc-nopch) (push) Waiting to run
citra-build / linux-arm64 (clang) (push) Waiting to run
citra-build / linux-arm64 (gcc-nopch) (push) Waiting to run
citra-build / macos (push) Waiting to run
citra-build / windows (msvc) (push) Waiting to run
citra-build / windows (msys2) (push) Waiting to run
citra-build / android (googleplay) (push) Waiting to run
citra-build / android (vanilla) (push) Waiting to run
citra-build / docker (push) Waiting to run
citra-format / clang-format (push) Waiting to run
citra-libretro / android (push) Waiting to run
citra-libretro / linux (push) Waiting to run
citra-libretro / windows (push) Waiting to run
citra-libretro / macos (arm64) (push) Waiting to run
citra-libretro / macos (x86_64) (push) Waiting to run
citra-libretro / ios (push) Waiting to run
citra-libretro / tvos (push) Waiting to run
citra-transifex / transifex (push) Waiting to run
Rather than emitting these subroutine functions for _every_ shader, only emit
the subroutines when the `LG2` and `EX2` instructions are actually used.
This saves a good chunk of memory across all shaders.
Inspired by Tanuki3DS.
citra-build / linux-x86_64 (appimage) (push) Has been cancelled
citra-build / linux-x86_64 (appimage-wayland) (push) Has been cancelled
citra-build / linux-x86_64 (gcc-nopch) (push) Has been cancelled
citra-build / linux-arm64 (clang) (push) Has been cancelled
citra-build / linux-arm64 (gcc-nopch) (push) Has been cancelled
citra-build / macos (push) Has been cancelled
citra-build / windows (msvc) (push) Has been cancelled
citra-build / windows (msys2) (push) Has been cancelled
citra-build / android (googleplay) (push) Has been cancelled
citra-build / android (vanilla) (push) Has been cancelled
citra-build / docker (push) Has been cancelled
citra-format / clang-format (push) Has been cancelled
citra-libretro / android (push) Has been cancelled
citra-libretro / linux (push) Has been cancelled
citra-libretro / windows (push) Has been cancelled
citra-libretro / macos (arm64) (push) Has been cancelled
citra-libretro / macos (x86_64) (push) Has been cancelled
citra-libretro / ios (push) Has been cancelled
citra-libretro / tvos (push) Has been cancelled
citra-transifex / transifex (push) Has been cancelled
* qt: Temporarily fix fullscreen on msys2 builds
* Removed excessive endif comments
We really only need these when nesting ifdefs
* blockRoundedCorners: Invert if condition for readability
---------
Co-authored-by: OpenSauce04 <opensauce04@gmail.com>