func()

in gdbclient/internal/pool/pool.go [339:373]


func (p *ConnPool) waitForConn(timeout time.Duration) (*ConnWebSocket, error) {
	endtime := time.Now().Add(timeout)

	for remaining := timeout; remaining > 0; remaining = endtime.Sub(time.Now()) {
		internal.Logger.Debug("wait conn", zap.Time("now", time.Now()), zap.Duration("timeout", remaining))
		ok := p.awaitAvailableConn(remaining)
		if !ok {
			internal.Logger.Debug("wait conn timeout", zap.Time("time", time.Now()))
			return nil, errGetConnTimeout
		}
		if p.closed() {
			internal.Logger.Debug("wait conn failed as pool closed")
			return nil, errPoolClosed
		}

		conn := p.selectLeastUsed()
		for conn != nil {
			inFlight := atomic.LoadInt32(&conn.borrowed)
			available := conn.availableInProcess()
			// FIXME: connection available
			// break to wait again if inFlight >= available in Java SDK
			// why do set to wait again if connection available, so typo it now
			if available == 0 {
				internal.Logger.Info("wait conn may timeout", zapPtr(conn),
					zap.Int32("inFlight", inFlight), zap.Int32("availableInProcess", available))
				break
			}
			if atomic.CompareAndSwapInt32(&conn.borrowed, inFlight, inFlight+1) {
				return conn, nil
			}
		}
	}

	return nil, errGetConnTimeout
}