public KernelResult Connect(out KClientSession clientSession) { clientSession = null; KProcess currentProcess = KernelContext.Scheduler.GetCurrentProcess(); if (currentProcess.ResourceLimit != null && !currentProcess.ResourceLimit.Reserve(LimitableResource.Session, 1)) { return(KernelResult.ResLimitExceeded); } if (!IncrementSessionsCount()) { currentProcess.ResourceLimit?.Release(LimitableResource.Session, 1); return(KernelResult.SessionCountExceeded); } KSession session = new KSession(KernelContext, this); KernelResult result = _parent.EnqueueIncomingSession(session.ServerSession); if (result != KernelResult.Success) { session.ClientSession.DecrementReferenceCount(); session.ServerSession.DecrementReferenceCount(); return(result); } clientSession = session.ClientSession; return(result); }
public KernelResult Connect(out KClientSession clientSession) { clientSession = null; KProcess currentProcess = KernelContext.Scheduler.GetCurrentProcess(); if (currentProcess.ResourceLimit != null && !currentProcess.ResourceLimit.Reserve(LimitableResource.Session, 1)) { return(KernelResult.ResLimitExceeded); } lock (_countIncLock) { if (_sessionsCount < _maxSessions) { _sessionsCount++; } else { currentProcess.ResourceLimit?.Release(LimitableResource.Session, 1); return(KernelResult.SessionCountExceeded); } if (_currentCapacity < _sessionsCount) { _currentCapacity = _sessionsCount; } } KSession session = new KSession(KernelContext); if (Service != null) { session.ClientSession.Service = Service; } KernelResult result = _parent.EnqueueIncomingSession(session.ServerSession); if (result != KernelResult.Success) { session.ClientSession.DecrementReferenceCount(); session.ServerSession.DecrementReferenceCount(); return(result); } clientSession = session.ClientSession; return(result); }