diff --git a/src/main.rs b/src/main.rs index 099e646..dd22afa 100644 --- a/src/main.rs +++ b/src/main.rs @@ -9,20 +9,51 @@ use std::sync::Mutex; use lazy_static::lazy_static; -#[repr(C, align(65536))] +lazy_static! { + static ref POOL: Pool = Pool::default(); +} + struct Pool { - data: [u8; 65536], + inner: Mutex, + base_ptr: usize, +} + +impl Default for Pool { + fn default() -> Self { + let inner = Mutex::new(PoolInner { data: [0; 0x10000], begin: 0, end: 0, last_position: 0 }); + let base_ptr = inner.lock().unwrap().data.as_ptr() as usize; + Pool { + inner, + base_ptr, + } + } +} + +impl Pool { + fn alloc(&self, layout: Layout) -> u16 { + self.inner.lock().unwrap().alloc(layout) + } + fn dealloc(&self, sptr: u16) { + self.inner.lock().unwrap().dealloc(sptr) + } +} + +impl std::fmt::Debug for Pool { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + self.inner.lock().unwrap().fmt(f) + } +} + +#[repr(C, align(0x10000))] +struct PoolInner { + data: [u8; 0x10000], begin: usize, end: usize, last_position: usize, } -lazy_static! { - static ref POOL: Mutex = Mutex::new(Pool { data: [0; 65536], begin: 0, end: 0, last_position: 0 }); -} - // halfassed bump allocator just to prove a point. -impl Pool { +impl PoolInner { fn alloc(&mut self, layout: Layout) -> u16 { let size = layout.size(); let align = layout.align(); @@ -78,10 +109,11 @@ impl Pool { } } -impl std::fmt::Debug for Pool { +impl std::fmt::Debug for PoolInner { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { write!( - f, "Pool {{ data: [_; 65536], begin: {}, end: {}, last_position: {} }}", + f, "Pool {{ data: [_; {}], begin: {}, end: {}, last_position: {} }}", + self.data.len(), self.begin, self.end, self.last_position, @@ -93,20 +125,20 @@ pub struct ShortPointer(u16, PhantomData); impl Drop for ShortPointer { fn drop(&mut self) { - POOL.lock().unwrap().dealloc(self.0) + POOL.dealloc(self.0) } } impl ShortPointer { fn deref_inner(&self) -> &mut T { unsafe { - ((((POOL.lock().unwrap().data.as_mut_ptr()) as usize) + (self.0 as usize)) as *mut T).as_mut().unwrap() + ((POOL.base_ptr + (self.0 as usize)) as *mut T).as_mut().unwrap() } } pub fn new(obj: T) -> Self { let layout = Layout::for_value(&obj); - let mut sptr = Self(POOL.lock().unwrap().alloc(layout), PhantomData::default()); + let mut sptr = Self(POOL.alloc(layout), PhantomData::default()); let uninitialized = core::mem::replace(sptr.deref_mut(), obj); core::mem::forget(uninitialized); sptr @@ -129,16 +161,16 @@ impl DerefMut for ShortPointer { #[allow(unused_must_use)] // dbg! statements fn main() { - dbg!(POOL.lock().unwrap()); + dbg!(&*POOL); { let foo = ShortPointer::new([1, 2, 3, 4, 5]); - dbg!(POOL.lock().unwrap()); + dbg!(&*POOL); { let bar = ShortPointer::new(0x900dCafeDa7e5_u64); - dbg!(POOL.lock().unwrap()); + dbg!(&*POOL); println!("{} | {:?} | {:x}", size_of_val(&foo), *foo, *bar); } - dbg!(POOL.lock().unwrap()); + dbg!(&*POOL); } - dbg!(POOL.lock().unwrap()); + dbg!(&*POOL); }