Nothing to see here, move along
at main 103 lines 3.7 kB view raw
1use crate::cap::object::ObjectTag; 2use crate::cap::pool::POOL; 3use crate::error::KernelError; 4use crate::types::Generation; 5 6crate::kernel_test!( 7 fn allocate_and_get() { 8 let mut pool = POOL.lock(); 9 let (id, generation) = 10 crate::tests::helpers::alloc_endpoint(&mut pool).expect("pool allocate failed"); 11 let _phys = pool.read_as::<lancer_core::object_layout::EndpointObject>(id, generation).expect("pool get failed"); 12 assert!( 13 pool.get_tag(id, generation) == Ok(ObjectTag::Endpoint), 14 "expected Endpoint tag" 15 ); 16 match pool.dec_ref_phys(id, generation) { 17 Some((phys, _)) => crate::cap::kernel_objects::free_slot(phys), 18 None => {} 19 } 20 } 21); 22 23crate::kernel_test!( 24 fn dec_ref_frees_slot() { 25 let mut pool = POOL.lock(); 26 let (id, generation) = 27 crate::tests::helpers::alloc_endpoint(&mut pool).expect("pool allocate"); 28 match pool.dec_ref_phys(id, generation) { 29 Some((phys, _)) => crate::cap::kernel_objects::free_slot(phys), 30 None => {} 31 } 32 let result = pool.read_as::<lancer_core::object_layout::EndpointObject>(id, generation); 33 assert!( 34 matches!(result, Err(KernelError::StaleGeneration)), 35 "expected StaleGeneration after free, got {:?}", 36 result.err() 37 ); 38 } 39); 40 41crate::kernel_test!( 42 fn inc_then_dec_keeps_alive() { 43 let mut pool = POOL.lock(); 44 let (id, generation) = 45 crate::tests::helpers::alloc_endpoint(&mut pool).expect("pool allocate"); 46 pool.inc_ref(id, generation).expect("inc_ref failed"); 47 let freed = pool.dec_ref_phys(id, generation); 48 assert!( 49 freed.is_none(), 50 "object freed too early (refcount should be 1)" 51 ); 52 let obj = pool.read_as::<lancer_core::object_layout::EndpointObject>(id, generation); 53 assert!(obj.is_ok(), "object should still be alive at refcount 1"); 54 match pool.dec_ref_phys(id, generation) { 55 Some((phys, _)) => crate::cap::kernel_objects::free_slot(phys), 56 None => {} 57 } 58 } 59); 60 61crate::kernel_test!( 62 fn exhaust_pool_returns_error() { 63 let mut pool = POOL.lock(); 64 let _gen0 = Generation::new(0); 65 let mut allocated = 66 crate::static_vec::StaticVec::<(crate::types::ObjPhys, Generation), 1024>::new(); 67 68 let mut count: usize = 0; 69 loop { 70 match crate::tests::helpers::alloc_endpoint(&mut pool) { 71 Ok((id, generation)) => { 72 let _ = allocated.push((id, generation)); 73 count += 1; 74 } 75 Err(KernelError::PoolExhausted) => break, 76 Err(e) => panic!("unexpected error: {:?}", e), 77 } 78 } 79 assert!(count > 0, "could not allocate any objects"); 80 81 allocated.as_slice().iter().for_each(|&(id, generation)| { 82 match pool.dec_ref_phys(id, generation) { 83 Some((phys, _)) => crate::cap::kernel_objects::free_slot(phys), 84 None => {} 85 } 86 }); 87 } 88); 89 90crate::kernel_test!( 91 fn arena_free_already_free_is_noop() { 92 let mut pool = POOL.lock(); 93 let (id, generation) = crate::tests::helpers::alloc_endpoint(&mut pool).expect("alloc"); 94 95 let freed = pool.free_phys(id, generation); 96 assert!(freed.is_ok(), "first free should succeed"); 97 98 assert!( 99 pool.read_as::<lancer_core::object_layout::EndpointObject>(id, generation).is_err(), 100 "slot should not be accessible after free" 101 ); 102 } 103);