1use super::{UmaFlags, UmaKeg};
2use alloc::sync::Arc;
3
4#[repr(C)]
12pub struct Slab<I> {
13 pub hdr: SlabHdr<I>, pub free: [I], }
16
17impl<I> Slab<I> {
18 pub fn alloc_item(&mut self) -> *mut u8 {
25 self.hdr.free_count -= 1;
26
27 if self.hdr.free_count != 0 {
28 let off = self.hdr.first_free * self.hdr.keg.allocated_size();
29
30 return unsafe { self.hdr.items.add(off) };
31 }
32
33 todo!()
34 }
35}
36
37pub struct SlabHdr<I> {
39 pub keg: Arc<UmaKeg<I>>, pub free_count: usize, pub first_free: usize, pub items: *mut u8, }
44
45#[repr(C)]
47pub struct StdFree {
48 pub item: u8, }
50
51unsafe impl FreeItem for StdFree {
52 fn new(idx: usize) -> Self {
53 Self {
54 item: (idx + 1).try_into().unwrap(),
55 }
56 }
57
58 fn flags() -> UmaFlags {
59 UmaFlags::zeroed()
60 }
61}
62
63#[repr(C)]
65#[allow(dead_code)] pub struct RefFree {
67 pub item: u8, pub refs: u32, }
70
71unsafe impl FreeItem for RefFree {
72 fn new(idx: usize) -> Self {
73 Self {
74 item: (idx + 1).try_into().unwrap(),
75 refs: 0,
76 }
77 }
78
79 fn flags() -> UmaFlags {
80 UmaFlags::VToSlab.into()
81 }
82}
83
84pub unsafe trait FreeItem: Sized {
89 fn new(idx: usize) -> Self;
90 fn flags() -> UmaFlags;
91}