use crate::error::VmemError;
use crate::lazy_reservation::LazyReservation;
#[cfg(aligned_vmem_mock)]
use crate::mock;
#[cfg(not(aligned_vmem_mock))]
use crate::os::reserve_aligned_lazy_raw;
#[cfg(aligned_vmem_mock)]
use crate::os::reserve_aligned_raw;
use super::internal::{
finish_reservation, validate_initial_commit, validate_size_align, RawReservation,
};
#[must_use]
#[cfg(feature = "lazy-commit")]
#[cfg_attr(docsrs, doc(cfg(feature = "lazy-commit")))]
pub fn reserve_aligned_lazy(
size: usize,
align: usize,
initial_commit: usize,
) -> Option<LazyReservation> {
try_reserve_aligned_lazy(size, align, initial_commit).ok()
}
#[cfg(feature = "lazy-commit")]
#[cfg_attr(docsrs, doc(cfg(feature = "lazy-commit")))]
pub fn try_reserve_aligned_lazy(
size: usize,
align: usize,
initial_commit: usize,
) -> Result<LazyReservation, VmemError> {
validate_size_align(size, align)?;
validate_initial_commit(initial_commit, size)?;
#[cfg(aligned_vmem_mock)]
if let Some(e) = mock::take_reserve_fault() {
mock::record(mock::Call::ReserveLazy {
size,
align,
initial_commit,
});
return Err(e);
}
#[cfg(aligned_vmem_mock)]
mock::record(mock::Call::ReserveLazy {
size,
align,
initial_commit,
});
#[cfg(aligned_vmem_mock)]
let raw = reserve_aligned_raw(size, align);
#[cfg(not(aligned_vmem_mock))]
let raw = reserve_aligned_lazy_raw(size, align, initial_commit);
finish_reservation(
size,
align,
raw.map(|(base, reservation, reservation_len)| RawReservation {
base,
reservation,
reservation_len,
granted_huge: false,
}),
)
.map(|r| LazyReservation::new(r, initial_commit))
}