| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- using Ryujinx.HLE.HOS.Kernel.Common;
- using Ryujinx.HLE.HOS.Kernel.Process;
- using System;
- namespace Ryujinx.HLE.HOS.Kernel.Ipc
- {
- class KSession : KAutoObject, IDisposable
- {
- public KServerSession ServerSession { get; }
- public KClientSession ClientSession { get; }
- private bool _hasBeenInitialized;
- public KSession(Horizon system) : base(system)
- {
- ServerSession = new KServerSession(system, this);
- ClientSession = new KClientSession(system, this);
- _hasBeenInitialized = true;
- }
- public void DisconnectClient()
- {
- if (ClientSession.State == ChannelState.Open)
- {
- ClientSession.State = ChannelState.ClientDisconnected;
- ServerSession.CancelAllRequestsClientDisconnected();
- }
- }
- public void DisconnectServer()
- {
- if (ClientSession.State == ChannelState.Open)
- {
- ClientSession.State = ChannelState.ServerDisconnected;
- }
- }
- public void Dispose()
- {
- Dispose(true);
- }
- protected virtual void Dispose(bool disposing)
- {
- if (disposing && ClientSession.Service is IDisposable disposableService)
- {
- disposableService.Dispose();
- }
- }
- protected override void Destroy()
- {
- if (_hasBeenInitialized)
- {
- KProcess creatorProcess = ClientSession.CreatorProcess;
- creatorProcess.ResourceLimit?.Release(LimitableResource.Session, 1);
- creatorProcess.DecrementReferenceCount();
- }
- }
- }
- }
|