mirror of
https://github.com/boykopovar/AnyPS5.git
synced 2026-10-28 12:05:06 +00:00
On Linux and macOS, sceKernelRaiseException runs the guest handler in the target's SIGUSR1 handler wherever the thread was interrupted. A thread interrupted while it held the address-wait lock of sceKernelSyncOnAddressWait, sceKernelSyncOnAddressWake or _umtx_op ran the handler with the lock held, so a handler that waits, as a stop-the-world collector's does, blocked every other thread that waits on or wakes an address. #5756 fixed this on Windows. The address-wait lock is now taken under DeliveryDeferral on every host. On POSIX the deferral is a count per thread: while it is raised the SIGUSR1 handler only records the signal, and DeliverDeferred sends it to the thread again once the lock is released. An address waiter waits on its own semaphore (sem_t, a dispatch semaphore on macOS) with the lock released and the deferral lifted, so a raise reaches a thread that waits for an address without a timeout. The address-lock phases of guest_raise_exception now run on every host, with a new phase that raises at a thread in an unbounded address wait.