diff --git a/src/sys/mod.rs b/src/sys/mod.rs index 34f3dcb..7c2b1c2 100644 --- a/src/sys/mod.rs +++ b/src/sys/mod.rs @@ -1,5 +1,20 @@ -pub use self::imp::*; +use core::atomic::{ATOMIC_USIZE_INIT, AtomicUsize, Ordering}; + +pub use self::imp::{map_stack, protect_stack, unmap_stack}; +use self::imp::sys_page_size; #[cfg(unix)] #[path = "unix.rs"] mod imp; + +static PAGE_SIZE_CACHE: AtomicUsize = ATOMIC_USIZE_INIT; +pub fn page_size() -> usize { + match PAGE_SIZE_CACHE.load(Ordering::Relaxed) { + 0 => { + let page_size = sys_page_size(); + PAGE_SIZE_CACHE.store(page_size, Ordering::Relaxed); + page_size + } + page_size => page_size + } +} diff --git a/src/sys/unix.rs b/src/sys/unix.rs index 284b427..e292633 100644 --- a/src/sys/unix.rs +++ b/src/sys/unix.rs @@ -3,10 +3,13 @@ use core::prelude::*; use self::libc::{c_void, c_int, size_t}; use self::libc::{mmap, mprotect, munmap}; use self::libc::MAP_FAILED; +use super::page_size; use core::ptr; -pub fn page_size() -> usize { +#[cold] +#[inline(never)] +pub fn sys_page_size() -> usize { unsafe { libc::sysconf(libc::_SC_PAGESIZE) as usize }