When multiple copies of the same DLL are loaded into the same process
(e.g. for libretro multi-instance support), all copies share the same
PID. Using only the PID as the name suffix caused CreateFileMapping to
return the existing named kernel object instead of creating a new one,
so both instances silently mapped the same 4GB+ GameCube/Wii RAM region
and instantly corrupted each other.
Fix this by also embedding the address of a static-local variable in the
name. Because each DLL copy is mapped at a different base address in the
process, s_dll_id lives at a unique virtual address in every copy, so
its value acts as a stable, zero-cost, per-instance discriminator.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Internal details: The large region is split into individual same-sized blocks of memory. On creation, we allocate a single block of memory that will always remain zero, and map that into the entire memory region. Then, the first time any of these blocks is written to, we swap the mapped zero block out with a newly allocated block of memory. On clear, we swap back to the zero block and deallocate the data blocks. That way we only actually allocate one zero block as well as a handful of real data blocks where the JitCache actually writes to.