Nothing to see here, move along
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);