#[cfg(target_family = "unix")]
#[allow(unused_results)]
pub unsafe fn mlock(ptr: *const u8, len: usize) {
libc::mlock(ptr as *const std::os::raw::c_void, len);
#[cfg(any(target_os = "freebsd", target_os = "dragonfly"))]
libc::madvise(ptr as *mut std::os::raw::c_void, len, libc::MADV_NOCORE);
#[cfg(target_os = "linux")]
libc::madvise(ptr as *mut std::os::raw::c_void, len, libc::MADV_DONTDUMP);
}
#[cfg(target_family = "wasm")]
pub unsafe fn mlock(_ptr: *const u8, _len: usize) {}
#[cfg(target_family = "windows")]
#[allow(unused_results)]
pub unsafe fn mlock(ptr: *const u8, len: usize) {
kernel32::VirtualLock(ptr as _, len as u64);
}
#[cfg(target_family = "unix")]
#[allow(unused_results)]
pub unsafe fn munlock(ptr: *const u8, len: usize) {
libc::munlock(ptr as *const std::os::raw::c_void, len);
#[cfg(any(target_os = "freebsd", target_os = "dragonfly"))]
libc::madvise(ptr as *mut std::os::raw::c_void, len, libc::MADV_CORE);
#[cfg(target_os = "linux")]
libc::madvise(ptr as *mut std::os::raw::c_void, len, libc::MADV_DODUMP);
}
#[cfg(target_family = "wasm")]
pub unsafe fn munlock(_ptr: *const u8, _len: usize) {}
#[cfg(target_family = "windows")]
#[allow(unused_results)]
pub unsafe fn munlock(ptr: *const u8, len: usize) {
kernel32::VirtualUnlock(ptr as _, len as u64);
}
#[inline(never)]
unsafe fn memset(s: *mut u8, c: u8, n: usize) {
volatile_set(s, c, n)
}
#[inline]
pub unsafe fn zeroize(dest: *const u8, n: usize) {
memset(dest as *mut u8, 0, n);
atomic_fence()
}
#[inline]
fn atomic_fence() {
core::sync::atomic::compiler_fence(core::sync::atomic::Ordering::SeqCst);
}
#[inline]
unsafe fn volatile_set<T: Copy + Sized>(dst: *mut T, src: T, count: usize) {
for i in 0..count {
let ptr = dst.add(i);
std::ptr::write_volatile(ptr, src);
}
}