reserveMemory method
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);
}