use buddy_pool::BuddyPool;
use buddy_pool::BuddyConfig;
use buddy_pool::BuddyErrorType;
use std::alloc::alloc;
use std::alloc::Layout;
fn main() {
let bytes: usize = 2 * 1024 * 1024;
let malloc_base =
unsafe {
alloc(Layout::array::<u8>(bytes).unwrap())
} as usize;
let config =
BuddyConfig {
base: malloc_base, size: bytes, min_alloc: 1, max_alloc: 17 * 1024, min_buddy: 8192, };
println!("Creating a pool at {:#x} containing {} bytes",
config.base, config.size);
let mut pool = BuddyPool::new(config).unwrap();
let address = pool.alloc(config.max_alloc).unwrap();
assert!(address >= config.base && address < config.base + config.size);
pool.free(address).unwrap();
println!("Allocated and freed at {:#x}", address);
let result = pool.free(address);
assert!(result.is_err());
assert!(result.unwrap_err().error_type() == BuddyErrorType::FreeingFreeMemory);
let result = pool.alloc(config.min_alloc - 1);
assert!(result.is_err());
assert!(result.unwrap_err().error_type() == BuddyErrorType::UndersizeAlloc);
let result = pool.alloc(config.max_alloc + 1);
assert!(result.is_err());
assert!(result.unwrap_err().error_type() == BuddyErrorType::OversizeAlloc);
let mut allocs = 0;
loop {
let result = pool.alloc(config.min_alloc);
if result.is_err() {
let error = result.unwrap_err();
assert!(error.error_type() == BuddyErrorType::OutOfMemory);
break;
}
allocs += 1;
}
println!("Did {} alloc calls.", allocs);
assert!(allocs == config.size / config.min_buddy);
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn run_main() {
main();
}
}