diff options
| author | gdkchan <gab.dark.100@gmail.com> | 2020-07-19 15:24:18 -0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-07-19 15:24:18 -0300 |
| commit | e7f2a5ecb709ff3ee82bb39ab32a16b5db0c101d (patch) | |
| tree | f1931e1db2d0e6772d014856ab09ce1e78a8787c /Ryujinx.HLE/HOS/Kernel/SupervisorCall/Syscall.cs | |
| parent | 3af2ce74ecf76cc8d6fdb9ff19101bfee47af7dd (diff) | |
Fix session service disposal and improve transfer memory implementation (#1397)
* Fix session service disposal and improve transfer memory implementation
* Remove useless assignment
Diffstat (limited to 'Ryujinx.HLE/HOS/Kernel/SupervisorCall/Syscall.cs')
| -rw-r--r-- | Ryujinx.HLE/HOS/Kernel/SupervisorCall/Syscall.cs | 55 |
1 files changed, 30 insertions, 25 deletions
diff --git a/Ryujinx.HLE/HOS/Kernel/SupervisorCall/Syscall.cs b/Ryujinx.HLE/HOS/Kernel/SupervisorCall/Syscall.cs index c0f89455..e29259bf 100644 --- a/Ryujinx.HLE/HOS/Kernel/SupervisorCall/Syscall.cs +++ b/Ryujinx.HLE/HOS/Kernel/SupervisorCall/Syscall.cs @@ -991,16 +991,41 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall KProcess process = _context.Scheduler.GetCurrentProcess(); - KernelResult result = process.MemoryManager.ReserveTransferMemory(address, size, permission); + KResourceLimit resourceLimit = process.ResourceLimit; + + if (resourceLimit != null && !resourceLimit.Reserve(LimitableResource.TransferMemory, 1)) + { + return KernelResult.ResLimitExceeded; + } + + void CleanUpForError() + { + resourceLimit?.Release(LimitableResource.TransferMemory, 1); + } + + if (!process.MemoryManager.InsideAddrSpace(address, size)) + { + CleanUpForError(); + + return KernelResult.InvalidMemState; + } + + KTransferMemory transferMemory = new KTransferMemory(_context); + + KernelResult result = transferMemory.Initialize(address, size, permission); if (result != KernelResult.Success) { + CleanUpForError(); + return result; } - KTransferMemory transferMemory = new KTransferMemory(_context, address, size); + result = process.HandleTable.GenerateHandle(transferMemory, out handle); + + transferMemory.DecrementReferenceCount(); - return process.HandleTable.GenerateHandle(transferMemory, out handle); + return result; } public KernelResult MapPhysicalMemory(ulong address, ulong size) @@ -1271,29 +1296,9 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall public KernelResult CloseHandle(int handle) { - KProcess process = _context.Scheduler.GetCurrentProcess(); - - KAutoObject obj = process.HandleTable.GetObject<KAutoObject>(handle); - - process.HandleTable.CloseHandle(handle); - - if (obj == null) - { - return KernelResult.InvalidHandle; - } - - if (obj is KSession session) - { - session.Dispose(); - } - else if (obj is KTransferMemory transferMemory) - { - process.MemoryManager.ResetTransferMemory( - transferMemory.Address, - transferMemory.Size); - } + KProcess currentProcess = _context.Scheduler.GetCurrentProcess(); - return KernelResult.Success; + return currentProcess.HandleTable.CloseHandle(handle) ? KernelResult.Success : KernelResult.InvalidHandle; } public KernelResult ResetSignal(int handle) |
