use crate::*;
use crate::meta::*;
use super::Error;
use winapi::um::memoryapi::{VirtualAlloc, VirtualFree};
use winapi::um::winnt::{PAGE_READWRITE, MEM_COMMIT, MEM_RELEASE};
use core::ptr::{null_mut, NonNull};
#[doc = include_str!("_refs.md")]
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)] #[repr(transparent)] pub struct VirtualCommit;
impl Meta for VirtualCommit {
type Error = Error;
const MIN_ALIGN : Alignment = ALIGN_4_KiB;
const MAX_ALIGN : Alignment = ALIGN_4_KiB;
const MAX_SIZE : usize = usize::MAX;
const ZST_SUPPORTED : bool = false;
}
unsafe impl Stateless for VirtualCommit {}
#[doc = include_str!("_refs.md")]
unsafe impl thin::Alloc for VirtualCommit {
fn alloc_zeroed(&self, size: usize) -> Result<AllocNN0, Error> {
NonNull::new(unsafe { VirtualAlloc(null_mut(), size, MEM_COMMIT, PAGE_READWRITE) }.cast()).ok_or_else(Error::get_last)
}
}
#[doc = include_str!("_refs.md")]
#[allow(clippy::missing_safety_doc)]
unsafe impl thin::Free for VirtualCommit {
unsafe fn free(&self, ptr: AllocNN) {
let success = unsafe { VirtualFree(ptr.as_ptr().cast(), 0, MEM_RELEASE) };
let result = if success == 0 { Err(Error::get_last()) } else { Ok(()) };
result.expect("VirtualFree failed");
}
}
unsafe impl fat::Realloc for VirtualCommit {}
#[no_implicit_prelude] mod cleanroom {
use super::{impls, VirtualCommit};
impls! {
unsafe impl ialloc::fat::Alloc for VirtualCommit => ialloc::thin::Alloc;
unsafe impl ialloc::fat::Free for VirtualCommit => ialloc::thin::Free;
}
}
#[test] fn thin_alignment() { thin::test::alignment(VirtualCommit) }
#[test] fn thin_edge_case_sizes() { thin::test::edge_case_sizes(VirtualCommit) }
#[test] fn thin_nullable() { thin::test::nullable(VirtualCommit) }
#[test] fn thin_zeroed() { thin::test::zeroed_alloc(VirtualCommit) }
#[test] fn thin_zst_support() { thin::test::zst_supported_accurate(VirtualCommit) }
#[test] fn fat_alignment() { fat::test::alignment(VirtualCommit) }
#[test] fn fat_edge_case_sizes() { fat::test::edge_case_sizes(VirtualCommit) }
#[test] fn fat_uninit_realloc() { fat::test::uninit_realloc(VirtualCommit) }
#[test] fn fat_zeroed() { fat::test::zeroed_alloc(VirtualCommit) }
#[test] fn fat_zeroed_realloc() { fat::test::zeroed_realloc(VirtualCommit) }
#[test] fn fat_zst_support() { fat::test::zst_supported_accurate(VirtualCommit) }