Fix session service disposal and improve transfer memory implementation (#1397)

* Fix session service disposal and improve transfer memory implementation

* Remove useless assignment
This commit is contained in:
gdkchan 2020-07-19 15:24:18 -03:00 committed by GitHub
parent 3af2ce74ec
commit e7f2a5ecb7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 123 additions and 113 deletions

View file

@ -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);
return process.HandleTable.GenerateHandle(transferMemory, out handle);
transferMemory.DecrementReferenceCount();
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();
KProcess currentProcess = _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);
}
return KernelResult.Success;
return currentProcess.HandleTable.CloseHandle(handle) ? KernelResult.Success : KernelResult.InvalidHandle;
}
public KernelResult ResetSignal(int handle)