const TWO_MEGABYTES: usize = 2 * 1024 * 1024;
const SIXTY_FOUR_BYTES: usize = 64;
const ZERO_BYTES: usize = 0;
pub struct AlignmentHint {
pub alignment: usize,
pub use_huge_pages: bool,
}
impl AlignmentHint {
pub fn new(num_bytes: usize) -> Self {
if num_bytes == 0 {
AlignmentHint {
alignment: ZERO_BYTES,
use_huge_pages: false,
}
} else if (num_bytes & (TWO_MEGABYTES - 1)) == 0 {
AlignmentHint {
alignment: TWO_MEGABYTES,
use_huge_pages: true,
}
} else {
AlignmentHint {
alignment: SIXTY_FOUR_BYTES,
use_huge_pages: false,
}
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn get_alignment_4mb_is_2mb_aligned_hugepage() {
let memory = AlignmentHint::new(2 * TWO_MEGABYTES);
assert_eq!(memory.alignment, TWO_MEGABYTES);
assert!(memory.use_huge_pages);
}
#[test]
fn get_alignment_2mb_is_2mb_aligned_hugepage() {
let memory = AlignmentHint::new(TWO_MEGABYTES);
assert_eq!(memory.alignment, TWO_MEGABYTES);
assert!(memory.use_huge_pages);
}
#[test]
fn get_alignment_1mb_is_64b_aligned() {
let memory = AlignmentHint::new(TWO_MEGABYTES / 2);
assert_eq!(memory.alignment, SIXTY_FOUR_BYTES);
assert!(!memory.use_huge_pages);
}
#[test]
fn get_alignment_63kb_is_64b_aligned() {
let memory = AlignmentHint::new(63 * 1024);
assert_eq!(memory.alignment, SIXTY_FOUR_BYTES);
assert!(!memory.use_huge_pages);
}
#[test]
fn get_alignment_64kb_is_64b_aligned() {
let memory = AlignmentHint::new(64 * 1024);
assert_eq!(memory.alignment, SIXTY_FOUR_BYTES);
assert!(!memory.use_huge_pages);
}
#[test]
fn get_alignment_0b_is_0b_aligned() {
let memory = AlignmentHint::new(0);
assert_eq!(memory.alignment, ZERO_BYTES);
assert!(!memory.use_huge_pages);
}
}