in gdbclient/internal/pool/pool.go [316:337]
func (p *ConnPool) borrowConn(timeout time.Duration) (*ConnWebSocket, error) {
conn := p.selectLeastUsed()
if conn == nil {
internal.Logger.Debug("borrow conn nil", zap.Int("poolSize", p.Size()))
return p.waitForConn(timeout)
}
for {
inFlight := atomic.LoadInt32(&conn.borrowed)
available := conn.availableInProcess()
if inFlight >= int32(p.maxSimultaneousUsagePerConn) && available == 0 {
internal.Logger.Debug("wait conn", zapPtr(conn),
zap.Int32("flight", conn.borrowed), zap.Int32("availableInProcess", available))
return p.waitForConn(timeout)
}
if atomic.CompareAndSwapInt32(&conn.borrowed, inFlight, inFlight+1) {
internal.Logger.Debug("borrowed conn", zapPtr(conn), zap.Time("time", time.Now()),
zap.Int32("flight", conn.borrowed), zap.Int32("availableInProcess", available))
return conn, nil
}
}
}