reserveMemory method

  1. @override
Future<void> reserveMemory(
  1. int size,
  2. int priority
)
override

ReserveMemory reserves memory/buffer space in the scope; the unit is bytes.

Implementation

@override
Future<void> reserveMemory(int size, int priority) async {
  if (_isDone) {
    // print('DEBUG: $name.reserveMemory called on done scope.');
    throw _wrapError(network_errors.ResourceScopeClosedException());
  }
  // print('DEBUG: $name.reserveMemory attempting to reserve $size bytes. Current memory: ${_resources.memory}');
  var err = _resources.reserveMemory(size, priority);
  if (err != null) {
    // print('DEBUG: $name.reserveMemory local reservation failed: $err');
    // TODO: metrics.BlockMemory(size);
    throw _wrapError(err);
  }
  // print('DEBUG: $name.reserveMemory local reservation succeeded. New memory: ${_resources.memory}');

  try {
    // print('DEBUG: $name.reserveMemory propagating to ancestors.');
    await _reserveMemoryForAncestors(size, priority);
    // print('DEBUG: $name.reserveMemory ancestor propagation succeeded.');
  } catch (e) {
    // print('DEBUG: $name.reserveMemory ancestor propagation FAILED: $e. Rolling back local reservation of $size bytes. Memory before rollback: ${_resources.memory}');
    _resources.releaseMemory(size); // Rollback local reservation
    final memoryAfterRollback = _resources.memory; // Explicitly read after rollback
    // print('DEBUG: $name.reserveMemory local reservation rolled back. Memory after rollback: $memoryAfterRollback');
    // Specific check for the failing test conditions - removing this as well
    // if (name == 'childScope' && size == 70 && memoryAfterRollback != 0) {
    //   print('CRITICAL DEBUG for childScope (size 70): Memory is $memoryAfterRollback immediately after rollback, expected 0.');
    // }
    // TODO: metrics.BlockMemory(size);
    throw _wrapError(e as Exception);
  }
  // TODO: trace.ReserveMemory(name, priority, size, _resources.memory);
  // TODO: metrics.AllowMemory(size);
}