internal void Free(HmuxConnection channel) { Success(); lock (this) { _activeCount--; bool failing = false; failing = _failTime > 0 || _busyTime > 0; int size = (_idleHead - _idleTail + _idle.Length) % _idle.Length; if (!failing && size < _idleSize) { Trace.TraceInformation("Returning channel '{0}' to pool", channel); _idleHead = (_idleHead + 1) % _idle.Length; _idle[_idleHead] = channel; channel = null; } } long now = Utils.CurrentTimeMillis(); long maxIdleTime = _loadBalanceIdleTime; HmuxConnection oldChannel = null; do { oldChannel = null; lock (this) { if (_idleHead != _idleTail) { int nextTail = (_idleTail + 1) % _idle.Length; oldChannel = _idle[nextTail]; if (oldChannel != null && (oldChannel.GetIdleStartTime() + maxIdleTime) < now) { _idle[nextTail] = null; _idleTail = nextTail; } else { oldChannel = null; } } } if (oldChannel != null) { oldChannel.CloseImpl(); Trace.TraceInformation("closing expired channel '{0}'", oldChannel); } } while (oldChannel != null); if (channel != null) { channel.CloseImpl(); } }