createPoolElement method

  1. @override
FutureOr<C?> createPoolElement({
  1. bool force = false,
})

Defaults: calls createConnection.

Implementation

@override
FutureOr<C?> createPoolElement({bool force = false}) {
  if (poolAliveElementsSize < maxConnections || force) {
    if (_creatingConnectionsCount > 3) {
      var yield1 = _yieldByCreatingConnections();
      var yield2 = _yieldByCreatingConnectionsYield();
      final yieldMs = yield1 + yield2;

      ++_creatingConnectionsYieldCount;

      return Future.delayed(Duration(milliseconds: yieldMs), () {
        --_creatingConnectionsYieldCount;

        var conn = catchFromPopulatedPool();
        if (conn == null) {
          //print('!!! yieldMs: $yield1 + $yield2 = $yieldMs >> _creatingConnectionsCount: $_creatingConnectionsCount > _creatingConnectionsYeldCount: $_creatingConnectionsYieldCount');
          if (poolAliveElementsSize < maxConnections || force) {
            super.createPoolElement(force: force);
            return _createPoolElementImpl();
          } else {
            return null;
          }
        }

        return conn.resolveMapped((conn) {
          if (conn != null) return conn;

          if (poolAliveElementsSize < maxConnections || force) {
            super.createPoolElement(force: force);
            return _createPoolElementImpl();
          } else {
            return null;
          }
        });
      });
    } else {
      super.createPoolElement(force: force);
      return _createPoolElementImpl();
    }
  } else {
    return null;
  }
}