/// Iterate over our table until we find an open entry, then insert into said entry fn insert(&self, ptr: *mut u8, size: usize) { for (entry_ptr, entry_size) inself.alloc_table.iter() { // SeqCst is good enough here, we don't care about perf, i just want to be correct! if entry_ptr
.compare_exchange(null_mut(), ptr, Ordering::SeqCst, Ordering::SeqCst)
.is_ok()
{
entry_size.store(size, Ordering::SeqCst); break;
}
}
}
fn remove(&self, ptr: *mut u8) -> usize { for (entry_ptr, entry_size) inself.alloc_table.iter() { // set the value to be something that will never try and be deallocated, so that we // don't have any chance of a race condition // // dont worry, LEDGER_LENGTH is really long to compensate for us not reclaiming space if entry_ptr
.compare_exchange(
ptr,
invalid_ptr(usize::MAX),
Ordering::SeqCst,
Ordering::SeqCst,
)
.is_ok()
{ return entry_size.load(Ordering::SeqCst);
}
}
panic!("Couldn't find a matching entry for {:x?}", ptr);
}
}
unsafeimpl GlobalAlloc for Ledger { unsafefn alloc(&self, layout: Layout) -> *mut u8 { let size = layout.size(); let ptr = System.alloc(layout); self.insert(ptr, size);
ptr
}
/// Returns a dangling pointer with the given address. This is used to store /// integer data in pointer fields. #[inline] fn invalid_ptr<T>(addr: usize) -> *mut T { let ptr = std::ptr::null_mut::<u8>().wrapping_add(addr);
debug_assert_eq!(ptr as usize, addr);
ptr.cast::<T>()
}
#[test] fn test_bytes_into_vec() { let vec = vec![33u8; 1024];
// Test cases where kind == KIND_VEC let b1 = Bytes::from(vec.clone());
assert_eq!(Vec::from(b1), vec);
// Test cases where kind == KIND_ARC, ref_cnt == 1 let b1 = Bytes::from(vec.clone());
drop(b1.clone());
assert_eq!(Vec::from(b1), vec);
// Test cases where kind == KIND_ARC, ref_cnt == 2 let b1 = Bytes::from(vec.clone()); let b2 = b1.clone();
assert_eq!(Vec::from(b1), vec);
// Test cases where vtable = SHARED_VTABLE, kind == KIND_ARC, ref_cnt == 1
assert_eq!(Vec::from(b2), vec);
// Test cases where offset != 0 letmut b1 = Bytes::from(vec.clone()); let b2 = b1.split_off(20);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.