private HmuxConnection OpenRecycle()
{
long now = Utils.CurrentTimeMillis();
HmuxConnection channel = null;
lock (this) {
if (_idleHead != _idleTail)
{
channel = _idle[_idleHead];
long freeTime = channel.GetIdleStartTime();
_idle[_idleHead] = null;
_idleHead = (_idleHead + _idle.Length - 1) % _idle.Length;
if (now < freeTime + _loadBalanceIdleTime)
{
_activeCount++;
channel.ClearIdleStartTime();
channel.ToActive();
Trace.TraceInformation("OpenRecycle '{0}'", channel);
return(channel);
}
}
}
if (channel != null)
{
if (_log.IsLoggable(EventLogEntryType.Information))
{
_log.Info(this + " close idle " + channel
+ " expire=" + new DateTime(channel.GetIdleStartTime() * 10 + _loadBalanceIdleTime * 10));
}
Trace.TraceInformation("closing expired channel '{0}'", channel);
channel.CloseImpl();
}
Trace.TraceInformation("OpenRecyle return 'null'");
return(null);
}