func()

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
		}
	}
}