From 8f7fa3933fd11e6a017cbc113f176ea866247ce2 Mon Sep 17 00:00:00 2001 From: ParantezTech <12572227+par274@users.noreply.github.com> Date: Sun, 11 Oct 2026 01:40:16 +0300 Subject: [PATCH] [HLE] Write single-view guest memory without the region lock --- .../Memory/PhysicalVirtualMemory.cs | 7 +++++++ .../GuestMemory/GuestSpaceOwner.cs | 2 ++ .../GuestMemory/SharedBackingViews.cs | 18 ++++++++++++++++++ 3 files changed, 27 insertions(+) diff --git a/src/SharpEmu.Core/Memory/PhysicalVirtualMemory.cs b/src/SharpEmu.Core/Memory/PhysicalVirtualMemory.cs index fe3b026..ea343fd 100644 --- a/src/SharpEmu.Core/Memory/PhysicalVirtualMemory.cs +++ b/src/SharpEmu.Core/Memory/PhysicalVirtualMemory.cs @@ -2070,6 +2070,13 @@ public sealed unsafe class PhysicalVirtualMemory : IVirtualMemory, IGuestMemoryA GuestImageWriteTracker.NotifyManagedWrite(virtualAddress, (ulong)source.Length); GuestGpuMemoryHook.MarkCpuWrite(virtualAddress, (ulong)source.Length); + if (!source.IsEmpty && _backedSpace is { } backed && !_disposed && + backed.TryWriteSingleView(virtualAddress, source)) + { + NotifyGuestWriteWatch(virtualAddress, source); + return true; + } + var requiresExclusiveAccess = false; _gate.EnterReadLock(); try diff --git a/src/SharpEmu.HLE/GuestMemory/GuestSpaceOwner.cs b/src/SharpEmu.HLE/GuestMemory/GuestSpaceOwner.cs index 2b44b28..1387921 100644 --- a/src/SharpEmu.HLE/GuestMemory/GuestSpaceOwner.cs +++ b/src/SharpEmu.HLE/GuestMemory/GuestSpaceOwner.cs @@ -67,6 +67,8 @@ public sealed class GuestSpaceOwner : IDisposable // Reads through a view that covers the whole range without any lock; false otherwise. public bool TryReadSingleView(ulong address, Span data) => _views.TryReadSingleView(address, data); + public bool TryWriteSingleView(ulong address, ReadOnlySpan data) => _views.TryWriteSingleView(address, data); + public object AliasSnapshot => _views.AliasSnapshot; public bool TryEnterAliasAccess() => _views.TryEnterAliasAccess(); diff --git a/src/SharpEmu.HLE/GuestMemory/SharedBackingViews.cs b/src/SharpEmu.HLE/GuestMemory/SharedBackingViews.cs index 43be043..1698426 100644 --- a/src/SharpEmu.HLE/GuestMemory/SharedBackingViews.cs +++ b/src/SharpEmu.HLE/GuestMemory/SharedBackingViews.cs @@ -118,6 +118,24 @@ public sealed unsafe class SharedBackingViews : IDisposable } } + public bool TryWriteSingleView(ulong address, ReadOnlySpan data) + { + if (!TryAccessSingleView(address, (ulong)data.Length, out var target)) + { + return false; + } + + try + { + data.CopyTo(new Span((void*)target, data.Length)); + return true; + } + finally + { + Interlocked.Decrement(ref _activeAccesses); + } + } + public bool TryReadBacking(ulong address, Span data) { if (TryAccessSingleView(address, (ulong)data.Length, out var source))